#include "stdafx.h" bool Parameter::Equals( const Parameter ¶m, bool isContravariant ) const { if( Type::Equals( param ) ) { return true; } else { if( this->isRef && this->GetBasicType() == DEF_ANY && param.isRef == false && param.IsPointer() || this->isRef == false && this->IsPointer() && param.isRef && param.GetBasicType() == DEF_ANY ) { /* ByRef var As Any と var As VoidPtr は同等 */ return true; } } if( isContravariant ) { // 反変引数を許可する if( this->IsContravariant( param ) ) { // 反変引数だったとき return true; } } return false; } bool Parameter::Equals( const Types &actualTypeParametersForThisProc, const Parameter ¶m, bool isContravariant ) const { if( Equals( param, isContravariant ) ) { return true; } if( this->IsTypeParameter() ) { // 型パラメータだったとき if( actualTypeParametersForThisProc[this->GetFormalTypeIndex()].Equals( param ) ) { // 戻り値が等しい return true; } } return false; } bool Parameters::Equals( const Parameters ¶ms, bool isContravariant ) const { if( this->size() != params.size() ){ return false; } int max = (int)this->size(); for( int i=0; iEquals( *params[i], isContravariant ) ){ return false; } } return true; } bool Parameters::Equals( const Types &actualTypeParametersForThisProc, const Parameters ¶ms, bool isContravariant ) const { if( this->size() != params.size() ){ return false; } int max = (int)this->size(); for( int i=0; iEquals( actualTypeParametersForThisProc, *params[i], isContravariant ) ){ return false; } } return true; }