// **************************************************************** // CentDedRessya_EkijikokuModifyOperation2 // **************************************************************** // ******************************** // CentDedRessya_EkijikokuModifyOperation2-操作 // ******************************** int CentDedRessya_EkijikokuModifyOperation2:: execute( CentDedRessya* pCentDedRessya , CdDedJikokuOrder aJikokuOrder ) { int iRv = 0 ; // -------------------------------- CentDedRessya aCentDedRessya( *pCentDedRessya ) ; if ( aJikokuOrder.getEkiOrder() == INT_MAX ) { aJikokuOrder.setEkiOrder( pCentDedRessya->getCentDedEkiJikokuCount() - 1 , CdDedJikokuOrder::EkiJikokuItem_Hatsu ) ; } if ( !( 0 <= aJikokuOrder.getEkiOrder() && aJikokuOrder.getEkiOrder() < pCentDedRessya->getCentDedEkiJikokuCount() ) ) { iRv = -1 ; // aJikokuOrder が範囲外です。 } //aCentDedRessya = 操作対象となる列車 //aJikokuOrder = 時刻Order // -------------------------------- // 1.新しい駅扱を決定 // -------------------------------- if ( iRv >= 0 ) { if ( m_bSetEkiatsukai ) // 駅扱の変更 { CentDedEkiJikoku aCentDedEkiJikoku = aCentDedRessya.getCentDedEkiJikoku( aJikokuOrder.getEkiOrder() ) ; CentDedEkiJikoku::EEkiatsukai eEkiatsukai = m_eEkiatsukai ; { //駅扱の変更 aCentDedEkiJikoku.setEkiatsukai( eEkiatsukai ) ; aCentDedRessya.setCentDedEkiJikoku( aJikokuOrder.getEkiOrder() , aCentDedEkiJikoku ) ; } } } //aCentDedRessya = 駅扱が変更されました。 // -------------------------------- // 2.時刻の変更 // -------------------------------- if ( iRv >= 0 ) { if ( m_eOperation == OperationModify ) { CdDedJikan aCdDedJikan( m_iSeconds * 60 ) ; aCentDedRessya.modifyRessyaJikoku( aCdDedJikan , aJikokuOrder ) ; } else if ( m_eOperation == OperationCopy ) { CdDedJikoku aCdDedJikokuSrc = aCentDedRessya.getEkiJikoku( m_iJikokuOrderCopySrc ) ; CdDedJikoku aCdDedJikokuDst = aCentDedRessya.getEkiJikoku( aJikokuOrder ) ; // 時刻は、単純に代入します。 { CentDedEkiJikoku aCentDedEkiJikoku = aCentDedRessya.getCentDedEkiJikoku( aJikokuOrder.getEkiOrder() ) ; aCdDedJikokuSrc.addSeconds( m_iSeconds * 60 ) ; if ( aJikokuOrder.getEkiJikokuItem() == CdDedJikokuOrder::EkiJikokuItem_Chaku) { aCentDedEkiJikoku.setChakujikoku( aCdDedJikokuSrc ) ; } else { aCentDedEkiJikoku.setHatsujikoku( aCdDedJikokuSrc ) ; } aCentDedRessya.setCentDedEkiJikoku( aJikokuOrder.getEkiOrder() , aCentDedEkiJikoku ) ; } } else if ( m_eOperation == OperationToNull ) { // NULL を設定 aCentDedRessya.setEkiJikoku( CdDedJikoku() , aJikokuOrder ) ; } } //aCentDedRessya = 駅時刻が変更されました。 // -------------------------------- // 駅扱・着時刻・発時刻を変更 // -------------------------------- if ( iRv >= 0 ) { *pCentDedRessya = aCentDedRessya ; } return ( iRv ) ; }
/* readCentDedRessya() の下請関数 (02)CentDedDgrEkiJikoku を生成し、 CentDedEkiJikoku で決まる属性を決定。 */ void CentDedDgrRessya::readCentDedRessya_02_CreateCentDedEkiJikoku( const CentDedRessya* pCentDedRessya ) { // 直前の駅の駅時刻。 CdDedJikoku aCdDedJikokuLastStation ; // 直前の駅の駅時刻でのX座標。aCdDedJikokuLastStation がNULLの場合は // 無効です。 // 最初の「NULLでない駅時刻」を見つかった場合は、その駅時刻から導出された // X座標になります。 // 2箇所目以降の「NULLでない駅時刻」以降は、 // 前の駅時刻からの経過時間を加算します。 // // iXZahyouLastStation = iXZahyouLastStation // + ( その駅の駅時刻 - aCdDedJikokuLastStation ) // // これにより、24:00をまたがって走る列車では、 // 24:00以降の駅時刻に対応する X座標は 24:00 相当(24*60*60=86400) 以上 // になります。 int iXZahyouLastStation = 0 ; for ( int iEkiOrder = 0 ; iEkiOrder < pCentDedRessya->getCentDedEkiJikokuCount() ; iEkiOrder ++ ) { CentDedEkiJikoku aCentDedEkiJikoku = pCentDedRessya->getCentDedEkiJikoku( iEkiOrder ) ; // 駅時刻から、X座標を計算 int iDgrXZahyou[2] = { INT_MIN , INT_MIN } ; for ( int iChakuHatsu = 0 ; iChakuHatsu < 2 ; iChakuHatsu ++ ) { int iX = INT_MIN ; CdDedJikokuOrder::EEkiJikokuItem eEkiJikokuItem = CdDedJikokuOrder::EkiJikokuItem_Chaku ; if ( iChakuHatsu == 1 ) { eEkiJikokuItem = CdDedJikokuOrder::EkiJikokuItem_Hatsu ; } CdDedJikokuOrder aCdDedJikokuOrder ; aCdDedJikokuOrder.setEkiOrder( iEkiOrder , eEkiJikokuItem ) ; CdDedJikoku aCdDedJikoku = pCentDedRessya->getEkiJikoku( aCdDedJikokuOrder ) ; if ( aCdDedJikoku.isNull() ) { // NULL 時刻なら、処理なし } else if ( aCdDedJikokuLastStation.isNull() ) { // 1回目以降の、非NULL時刻 iX = aCdDedJikoku.getTotalSeconds() ; // 最初の、非NULL時刻 } else { // 2回目以降の、非NULL時刻 CdDedJikan aCdDedJikan = aCdDedJikoku.subJikoku( aCdDedJikokuLastStation ) ; iX = iXZahyouLastStation + aCdDedJikan.getTotalSeconds() ; } // -------------------------------- if ( iX != INT_MIN ) { aCdDedJikokuLastStation = aCdDedJikoku ; iXZahyouLastStation = iX ; } iDgrXZahyou[iChakuHatsu] = iX ; } CentDedDgrEkiJikoku aCentDedDgrEkiJikoku( aCentDedEkiJikoku.getEkiatsukai() , iDgrXZahyou[0] , iDgrXZahyou[1] ) ; m_MuCentDedDgrEkiJikoku.insert( aCentDedDgrEkiJikoku ) ; } }