You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
361 lines
8.4 KiB
361 lines
8.4 KiB
//+-------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
//
|
|
// Copyright (C) Microsoft Corporation, 1997 - 1998
|
|
//
|
|
// File: propmbn.cpp
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
//
|
|
// PROPMBN.CPP
|
|
//
|
|
|
|
#include <basetsd.h>
|
|
#include <assert.h>
|
|
#include <string.h>
|
|
#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) ) ;
|
|
}
|