//+------------------------------------------------------------------------- // // Microsoft Windows // // Copyright (C) Microsoft Corporation, 1997 - 1998 // // File: propmbn.cpp // //-------------------------------------------------------------------------- // // PROPMBN.CPP // #include #include #include #include "gmprop.h" #include "gmobj.h" #include "algos.h" GOBJMBN * GOBJPROPTYPE :: CloneNew ( MODEL & modelSelf, MODEL & modelNew, GOBJMBN * pgobjNew ) { GOBJPROPTYPE * pgproptype; if ( pgobjNew ) { DynCastThrow( pgobjNew, pgproptype ); } else { pgproptype = new GOBJPROPTYPE; } ASSERT_THROW( GOBJMBN::CloneNew( modelSelf, modelNew, pgproptype ), EC_INTERNAL_ERROR, "cloning failed to returned object pointer" ); pgproptype->_fType = _fType; pgproptype->_zsrComment = modelNew.Mpsymtbl().intern( _zsrComment ); modelNew.Mpsymtbl().CloneVzsref( modelSelf.Mpsymtbl(), _vzsrChoice, pgproptype->_vzsrChoice ); return pgproptype; } PROPMBN :: PROPMBN () :_fType(0) { } PROPMBN :: PROPMBN ( const PROPMBN & bnp ) { self = bnp; } PROPMBN & PROPMBN :: operator = ( const PROPMBN & bnp ) { _zsrPropType = bnp._zsrPropType; _fType = bnp._fType; _vzsrStrings = bnp._vzsrStrings; _vrValues = bnp._vrValues; return self; } void PROPMBN :: Init ( GOBJPROPTYPE & bnpt ) { _zsrPropType = bnpt.ZsrefName(); _fType = bnpt.FPropType(); } bool PROPMBN :: operator == ( const PROPMBN & bnp ) const { return _zsrPropType == bnp._zsrPropType; } bool PROPMBN :: operator < ( const PROPMBN & bnp ) const { return _zsrPropType < bnp._zsrPropType; } bool PROPMBN :: operator == ( ZSREF zsrProp ) const { return ZsrPropType() == zsrProp; } bool PROPMBN :: operator == ( SZC szcProp ) const { return ::strcmp( szcProp, ZsrPropType().Szc() ) == 0; } UINT PROPMBN :: Count () const { if ( _fType & fPropString ) return _vzsrStrings.size(); else return _vrValues.size(); } ZSREF PROPMBN :: Zsr ( UINT i ) const { if ( ((_fType & fPropArray) == 0 && i > 0) || (_fType & fPropString) == 0) throw GMException(EC_PROP_MISUSE,"not a string property or not an array"); if ( i >= _vzsrStrings.size() ) throw GMException(EC_PROP_MISUSE,"property index out of range"); return _vzsrStrings[i]; } REAL PROPMBN :: Real ( UINT i ) const { if ( ((_fType & fPropArray) == 0 && i > 0) || (_fType & fPropString) ) throw GMException(EC_PROP_MISUSE,"not a numeric property or not an array"); if ( i >= _vrValues.size() ) throw GMException(EC_PROP_MISUSE,"property index out of range"); return _vrValues[i]; } void PROPMBN :: Reset () { _vrValues.clear(); _vzsrStrings.clear(); } void PROPMBN :: Set ( ZSREF zsr ) { if ( (_fType & fPropString) == 0 ) throw GMException(EC_PROP_MISUSE,"not a string property"); Reset(); _vzsrStrings.push_back(zsr); } void PROPMBN :: Set ( REAL r ) { if ( _fType & fPropString ) throw GMException(EC_PROP_MISUSE,"not a numeric property"); Reset(); _vrValues.push_back(r); } void PROPMBN :: Add ( ZSREF zsr ) { if ( (_fType & (fPropArray | fPropString)) == 0 ) throw GMException(EC_PROP_MISUSE,"not a string array property"); _vzsrStrings.push_back(zsr); } void PROPMBN :: Add ( REAL r ) { if ( (_fType & fPropArray) == 0 ) throw GMException(EC_PROP_MISUSE,"not a numeric array property"); _vrValues.push_back(r); } PROPMBN * LTBNPROP :: PFind ( ZSREF zsrProp ) { iterator itlt = find( begin(), end(), zsrProp ); if ( itlt == end() ) return NULL; return & (*itlt); } const PROPMBN * LTBNPROP :: PFind ( ZSREF zsrProp ) const { const_iterator itlt = find( begin(), end(), zsrProp ); if ( itlt == end() ) return NULL; return & (*itlt); } bool LTBNPROP :: Update ( const PROPMBN & bnp ) { PROPMBN * pprop = PFind( bnp.ZsrPropType() ); if ( pprop ) *pprop = bnp; else push_back( bnp ); return pprop != NULL; } // Force the list to contain only unique elements. Note that // the act of sorting and uniquing will discard duplicates randomly. bool LTBNPROP :: Uniqify () { int cBefore = size(); sort(); unique(); return size() == cBefore; } // Clone from another list with another symbol table void LTBNPROP :: Clone ( MODEL & model, const MODEL & modelOther, const LTBNPROP & ltbnOther ) { for ( const_iterator itlt = ltbnOther.begin(); itlt != ltbnOther.end(); itlt++ ) { const PROPMBN & prpOther = (*itlt); // Note that the dynamic cast below will test for failure to // find property type object GOBJMBN * pgobj = model.PgobjFind( prpOther.ZsrPropType() ); ASSERT_THROW( pgobj != NULL, EC_INTERNAL_ERROR, "missing property type in target network during cloning" ); GOBJPROPTYPE * pgobjPropType; DynCastThrow( pgobj, pgobjPropType ); PROPMBN prp; prp.Init( *pgobjPropType ); model.Mpsymtbl().CloneVzsref( modelOther.Mpsymtbl(), prpOther._vzsrStrings, prp._vzsrStrings ); prp._vrValues = prpOther._vrValues; push_back( prp ); } } static struct MPVOIPROPSZC { ESTDPROP _eProp; SZC _szcProp; } vVoiProp [] = { { ESTDP_label, "MS_label" }, { ESTDP_cost_fix, "MS_cost_fix" }, { ESTDP_cost_observe, "MS_cost_observe" }, { ESTDP_category, "MS_category" }, { ESTDP_normalState, "MS_normalState" }, { ESTDP_max, NULL } }; static struct MPLBLSZC { ESTDLBL _eLbl; SZC _szcLbl; } vLblSzc [] = { { ESTDLBL_other, "other" }, { ESTDLBL_hypo, "hypothesis" }, { ESTDLBL_info, "informational" }, { ESTDLBL_problem, "problem" }, { ESTDLBL_fixobs, "fixobs" }, { ESTDLBL_fixunobs, "fixunobs" }, { ESTDLBL_unfix, "unfixable" }, { ESTDLBL_config, "configuration" }, { ESTDLBL_max, NULL } }; SZC PROPMGR :: SzcLbl ( int iLbl ) { SZC szcOther = NULL; for ( int i = 0; vLblSzc[i]._szcLbl; i++ ) { if ( vLblSzc[i]._eLbl == iLbl ) return vLblSzc[i]._szcLbl; if ( vLblSzc[i]._eLbl == ESTDLBL_other ) szcOther = vLblSzc[i]._szcLbl; } return szcOther; } PROPMGR :: PROPMGR ( MODEL & model ) : _model(model) { // Locate all the standard property types; save their // name references whether or not they've been declared. SZC szcProp; for ( int i = 0; szcProp = vVoiProp[i]._szcProp ; i++ ) { GOBJPROPTYPE * ppt = NULL; _vzsrPropType.push_back( _model.Mpsymtbl().intern( szcProp ) ); GOBJMBN * pgobj = _model.PgobjFind( szcProp ); if ( pgobj ) { if ( pgobj->EType() == GOBJMBN::EBNO_PROP_TYPE ) { DynCastThrow( pgobj, ppt ); } } _vPropMap[i] = ppt; } // If we found "MS_label", prepare the correspondence table GOBJPROPTYPE * pptLabel = _vPropMap[ESTDP_label]; if ( pptLabel && (pptLabel->FPropType() & fPropChoice) > 0 ) { SZC szcChoice; const VZSREF & vzsr = pptLabel->VzsrChoice(); _vUserToLbl.resize( vzsr.size() ); // Clear the user-to-standard-label map for ( i = 0; i < _vUserToLbl.size(); ) _vUserToLbl[i++] = -1; for ( i = 0; szcChoice = vLblSzc[i]._szcLbl; i++ ) { int iLbl = -1; ZSREF zsrChoice = _model.Mpsymtbl().intern( szcChoice ); for ( int j = 0; j < vzsr.size(); j++ ) { if ( zsrChoice == vzsr[j] ) { iLbl = j; // Mark which standard label this user element corresponds to _vUserToLbl[iLbl] = i; break; } } // Mark which user element this standard label corresponds to _vLblToUser[i] = iLbl; } } else { // Clear the correspondence information for ( i = 0; i < ESTDLBL_max; i++ ) { _vLblToUser[i] = -1; } } } GOBJPROPTYPE * PROPMGR :: PPropType ( ESTDPROP evp ) { return _vPropMap[evp]; } // Return the name of the standard property ZSREF PROPMGR :: ZsrPropType ( ESTDPROP evp ) { ASSERT_THROW( evp >= 0 && evp < ESTDP_max, EC_INTERNAL_ERROR, "invalid property type usage" ); return _vzsrPropType[evp]; } // Find a standard property in a property list PROPMBN * PROPMGR :: PFind ( LTBNPROP & ltprop, ESTDPROP estd ) { return ltprop.PFind( ZsrPropType(estd) ) ; } // Find a standard property in the associated model's property list PROPMBN * PROPMGR :: PFind ( ESTDPROP estd ) { return _model.LtProp().PFind( ZsrPropType(estd) ) ; } // Find a standard property in a node's property list PROPMBN * PROPMGR :: PFind ( GNODEMBN & gnd, ESTDPROP estd ) { return gnd.LtProp().PFind( ZsrPropType(estd) ) ; }