예제 #1
0
int CentDedDgrRessya::updateRessyasenCont_01_calcRessyasenKiten( 
		int iEkiOrder ,
		int* piRessyasenKitenEkiOrder ) 
{
	//	『列車線起点駅Order』の条件は、
	//	「着時刻・発時刻のいずれかが指定されている AND 
	//	次の『駅Order』の駅扱が『停車』か『通過』」
	Mu<CentDedDgrEkiJikoku*>*	pMuCentDedDgrEkiJikoku 
		= this->getMuCentDedDgrEkiJikoku() ;

	for ( ; iEkiOrder < pMuCentDedDgrEkiJikoku->size() - 1 ; 
			iEkiOrder ++ )
	{
		CentDedDgrEkiJikoku*	pEkiJikokuCurr = 
			pMuCentDedDgrEkiJikoku->get( iEkiOrder ) ;
		CentDedDgrEkiJikoku*	pEkiJikokuNext = 
			pMuCentDedDgrEkiJikoku->get( iEkiOrder + 1 ) ;
 
		int iDgrXPosHatsu = pEkiJikokuCurr->getDgrXPosHatsu( true ) ;
		if ( iDgrXPosHatsu != INT_MIN && 
			( pEkiJikokuNext->getEkiatsukai() == 
				CentDedEkiJikoku::Ekiatsukai_Teisya ||
			  pEkiJikokuNext->getEkiatsukai() == 
				CentDedEkiJikoku::Ekiatsukai_Tsuuka ) ){
			*piRessyasenKitenEkiOrder = iEkiOrder ;
			return ( 0 ) ;
		} 
	}	
	return -1 ;	//	iEkiOrder 以降で、列車線起点駅がありません。
}
예제 #2
0
int CentDedDiaCont::eraseRessyasyubetsuIndex( int iRessyasyubetsuIndex ) 
{
	int iRv = 0 ;
	if ( iRv >= 0 ){
		if ( iRessyasyubetsuIndex == INT_MAX ){
			iRessyasyubetsuIndex = getRessyasyubetsuCount() - 1 ;
		}
		if ( !( 0 <= iRessyasyubetsuIndex && 
				iRessyasyubetsuIndex < getRessyasyubetsuCount() ) ){
			iRv = -1 ;	//	インデクスが不正
		}
	}
	if ( iRv >= 0 ){
		if ( isExistRessyaOfRessyasyubetsu( 
			iRessyasyubetsuIndex , NULL , NULL , NULL ) > 0 ){
			iRv = -3 ;	//	『列車種別』が iRessyasyubtsuIndex の列車が存在します。
		}
	}
	// --------------------------------
	//	iRessyasyubetsuIndex 以上の『列車種別Index』をもつ
	//	列車の『列車種別Index』を、-1
	if ( iRv >= 0 ){
		Mu<CentDedDia*>* pIfContGet = getMuPtr() ; 
		int iDiaIndex ;
		for ( iDiaIndex = 0 ; iDiaIndex < pIfContGet->size() ; iDiaIndex ++ ){
			CentDedDia*	pCentDedDia = pIfContGet->get( iDiaIndex ) ;
			iRv = pCentDedDia->eraseRessyasyubetsuIndex(
				 iRessyasyubetsuIndex );
		}
	}
	if ( iRv >= 0 ){
		m_iRessyasyubetsuCount -- ;
	}
	return ( iRv ) ;
}
예제 #3
0
	// ********************************
	//@name CentDedDiaCont-操作 駅の増減
	// ********************************
int CentDedDiaCont::onSetCentDedEki( const CentDedEkiCont* pCentDedEkiCont , int iEkiIndex ) 
{
	int iRv = 0 ;
	if ( iRv >= 0 ){
		int iDiaIndex ;
		Mu< CentDedDia* >* pIfContGet = getMuPtr() ;
		for ( iDiaIndex = 0 ; iDiaIndex < pIfContGet->size() ; iDiaIndex ++ ){
			pIfContGet->get( iDiaIndex )->onSetCentDedEki( pCentDedEkiCont , iEkiIndex ) ;
		}
	}
	return ( iRv ) ;
}
예제 #4
0
int CentDedDiaCont::eraseCentDedEkiJikoku( int iEkiIndex ) 
{
	int iRv = 0 ;
	if ( iRv >= 0 ){
		m_iEkiCount -- ;

		int iDiaIndex ;
		Mu< CentDedDia* >* pIfContGet = getMuPtr() ;
		for ( iDiaIndex = 0 ; iDiaIndex < pIfContGet->size() ; iDiaIndex ++ ){
			pIfContGet->get( iDiaIndex )->eraseCentDedEkiJikoku( iEkiIndex ) ;
		}
	}
	return ( iRv ) ;
}
예제 #5
0
int CentDedDgrRessya::updateRessyasenCont_04_adjustRessyasenSyuuten4( 
		const Mu<CentDedDgrEkiCont::CdDedDgrEki>* pMuCdDedDgrEki ,
		int iRessyasenKitenEkiOrder ,
		int* piRessyasenSyuutenEkiOrder ) 
{
	int iRessyasenSyuutenEkiOrder = *piRessyasenSyuutenEkiOrder ;
	// --------------------------------
	//	『主要駅』を探します。
	// --------------------------------
	Mu<CentDedDgrEkiJikoku*>*	pMuCentDedDgrEkiJikoku 
		= this->getMuCentDedDgrEkiJikoku() ;
	for ( int iEkiOrder = iRessyasenKitenEkiOrder + 1 ;
		iEkiOrder < iRessyasenSyuutenEkiOrder ; 
		iEkiOrder ++ )
	{
		CentDedDgrEkiCont::CdDedDgrEki aCdDedDgrEki = 
			pMuCdDedDgrEki->get( iEkiOrder ) ;
		CentDedDgrEkiJikoku aCentDedDgrEkiJikoku = 
			*pMuCentDedDgrEkiJikoku->get( iEkiOrder ) ;
		int jikokuToueki = aCentDedDgrEkiJikoku.getDgrXPosChaku( true ) ;

		if ( jikokuToueki != INT_MIN && 
			aCdDedDgrEki.getIsSyuyoueki() )
		{
			//	『列車線起点駅Order』と『列車線終点駅Order』の間の
			//	途中駅で、着時刻・発時刻のいずれかが指定されている主要駅
			//	があれば、それを
			//	『列車線終点駅Order』とします。
			*piRessyasenSyuutenEkiOrder = iEkiOrder ;
			return 	1 ;	//	『列車線終点駅Order』の補正を行いました。
		}
		if ( aCentDedDgrEkiJikoku.getEkiatsukai() == 
				CentDedEkiJikoku::Ekiatsukai_Tsuuka && 
			( jikokuToueki != INT_MIN  ) )
		{
			//「通過駅で、
			//着時刻か発時刻のいずれかが指定されている」 
			*piRessyasenSyuutenEkiOrder = iEkiOrder ;
			return 	1 ;	//	『列車線終点駅Order』の補正を行いました。
		}


	}
	return 0 ;
}
예제 #6
0
	// ********************************
	//@name 操作
	// ********************************
void CentDedRosen::insert( 
	const CentDedRosen& rosenToAdd_enter ,
	int iEkiIndexToInsert ) 
{
	CentDedRosen rosenToAdd = rosenToAdd_enter ;
	//○組入れ先駅Index小(起点側)・組入れ先Index大(終点側)を決定
	//	○[組入れ先が始発駅]
	//  	○組入れ先駅Index小=-1
	//  	○組入れ先駅Index大=入力された組入れ先の駅Index
	//	○[組入れ先が中間駅]
	//  	○組入れ先駅Index小=入力された組入れ先の駅Index
	//  	○組入れ先駅Index大=入力された組入れ先の駅Index
	//	○[組入れ先が終着駅]
	//  	○組入れ先駅Index小=駅数-1
	//  	○組入れ先駅Index大=駅数
	int iEkiIndexToInsertMin = -1 ;
	int iEkiIndexToInsertMax = -1 ;
	{
		//○[組入れ先が始発駅]
		if ( iEkiIndexToInsert == 0 )
		{
			iEkiIndexToInsertMin = -1 ;
			iEkiIndexToInsertMax = iEkiIndexToInsert ;
		}
		//○[組入れ先が中間駅]
		//	○組入れ先駅Index小=入力された組入れ先の駅Index
		//	○組入れ先駅Index大=入力された組入れ先の駅Index
		else if ( 0 < iEkiIndexToInsert &&
			iEkiIndexToInsert < getCentDedEkiCont()->size() - 1 )
		{
			iEkiIndexToInsertMin = iEkiIndexToInsert ;
			iEkiIndexToInsertMax = iEkiIndexToInsert ;
		}
		//○[組入れ先が終着駅]
		//	○組入れ先駅Index小=駅数-1
		//	○組入れ先駅Index大=駅数
		else
		{
			iEkiIndexToInsertMin = getCentDedEkiCont()->size() - 1 ;
			iEkiIndexToInsertMax = getCentDedEkiCont()->size() ;
		}
	}
	//○[組入れ先が中間駅]なら、その駅を分割
	if ( 0 < iEkiIndexToInsertMin &&
			iEkiIndexToInsertMax < getCentDedEkiCont()->size() - 1 )
	{
		// ○組入れ先駅Index小=入力された組入れ先の駅Index
		// │組入れ先駅Index大=入力された組入れ先の駅Index+1
		iEkiIndexToInsertMax = iEkiIndexToInsertMin + 1 ;

		// ○組入れ先駅Index小と同名駅を、組入れ先駅Index+1の位置に追加
		// │組入れ先駅Index小の駅は下り着時刻
		// │組入れ先駅Index大の駅は上り着時刻
		{
			CentDedEkiCont* pCentDedEkiCont = getCentDedEkiCont() ;
			CentDedEki*	pDedEkiInsertMin = pCentDedEkiCont->getMuPtr()->get( iEkiIndexToInsertMin ) ;
			pCentDedEkiCont->insert( *pDedEkiInsertMin , iEkiIndexToInsertMax ) ;
			CentDedEki*	pDedEkiInsertMax = pCentDedEkiCont->getMuPtr()->get( iEkiIndexToInsertMax ) ;
			pDedEkiInsertMin->setEkijikokukeisiki( CentDedEki::Jikokukeisiki_KudariChaku ) ;
			pDedEkiInsertMax->setEkijikokukeisiki( CentDedEki::Jikokukeisiki_NoboriChaku ) ;
		}

		//○全ダイヤのループ
		CentDedDiaCont* pCentDedDiaCont = &m_CentDedDiaCont ;
		int idxDia ;
		for ( idxDia = 0 ; idxDia < pCentDedDiaCont->size() ; idxDia ++ )
		{
			CentDedDia* pCentDedDia = pCentDedDiaCont->getMuPtr()->get( idxDia ) ;
			//○下り列車全列車のループ
			//│ ○組入れ先駅Order小・組入れ先駅Order大を求める
			{
				CentDedRessyaCont* pCentDedRessyaCont = pCentDedDia->getCentDedRessyaCont( Ressyahoukou_Kudari ) ;
				int iEkiOrderToInsertMin = -1 ;
				int iEkiOrderToInsertMax = -1 ;
				{
					int iEkiOrder1 = pCentDedRessyaCont->EkiOrderOfEkiIndex( iEkiIndexToInsertMin ) ;
					int iEkiOrder2 = pCentDedRessyaCont->EkiOrderOfEkiIndex( iEkiIndexToInsertMax ) ;
					iEkiOrderToInsertMin = min( iEkiOrder1 , iEkiOrder2 ) ;
					iEkiOrderToInsertMax = max( iEkiOrder1 , iEkiOrder2 ) ;
				}

				for ( int idxRessya = 0 ; idxRessya < pCentDedRessyaCont->size() ; idxRessya ++ )
				{
					CentDedRessya* pCentDedRessya = pCentDedRessyaCont->getMuPtr()->get( idxRessya ) ;
					CentDedEkiJikoku aEkiJikokuToInserMin = pCentDedRessya->getCentDedEkiJikoku( iEkiOrderToInsertMin ) ;
					CentDedEkiJikoku aEkiJikokuToInserMax = pCentDedRessya->getCentDedEkiJikoku( iEkiOrderToInsertMax ) ;

					//│ ○[組入れ先駅Order小が始発駅の列車]
					//│ │組入れ先駅Order大に、組入れ先Order小をコピー
					//│ ↓組入れ先駅Order小は、運行なしとする。
					if ( pCentDedRessya->getSihatsuEki() == iEkiOrderToInsertMin )
					{
						aEkiJikokuToInserMax = aEkiJikokuToInserMin ;
						aEkiJikokuToInserMin.setEkiatsukai( CentDedEkiJikoku::Ekiatsukai_None ) ;
					}
					//│ ○[組入れ先駅Index小が中間駅の列車]
					//│ │ ○組入れ先駅Order大に、組入れ先駅Order小の駅時刻をコピー
					else if ( pCentDedRessya->getSihatsuEki() < iEkiOrderToInsertMin && 
						iEkiOrderToInsertMin < pCentDedRessya->getSyuuchakuEki() ) 
					{
						aEkiJikokuToInserMax = aEkiJikokuToInserMin ;
					}
					//│ ○[組入れ先駅Order小が終着駅の列車]
					//│  組入れ先駅Order小は、そのままとする。
					//│  組入れ先駅Order大は、運行なしとする。
					else if ( pCentDedRessya->getSyuuchakuEki() == iEkiOrderToInsertMin )
					{
						aEkiJikokuToInserMax.setEkiatsukai( CentDedEkiJikoku::Ekiatsukai_None ) ;
					}

					pCentDedRessya->setCentDedEkiJikoku( iEkiOrderToInsertMin , aEkiJikokuToInserMin ) ;
					pCentDedRessya->setCentDedEkiJikoku( iEkiOrderToInsertMax , aEkiJikokuToInserMax ) ;
				}
			}

			//○上り列車全列車のループ
			//   ○組入れ先駅Order小・組入れ先駅Order大を求める
			{
				CentDedRessyaCont* pCentDedRessyaCont = pCentDedDia->getCentDedRessyaCont( Ressyahoukou_Nobori ) ;
				int iEkiOrderToInsertMin = pCentDedRessyaCont->EkiOrderOfEkiIndex( iEkiIndexToInsertMin ) ;
				int iEkiOrderToInsertMax = pCentDedRessyaCont->EkiOrderOfEkiIndex( iEkiIndexToInsertMax ) ;
				for ( int idxRessya = 0 ; idxRessya < pCentDedRessyaCont->size() ; idxRessya ++ )
				{
					CentDedRessya* pCentDedRessya = pCentDedRessyaCont->getMuPtr()->get( idxRessya ) ;
					CentDedEkiJikoku aEkiJikokuToInserMin = pCentDedRessya->getCentDedEkiJikoku( iEkiOrderToInsertMax ) ;
					CentDedEkiJikoku aEkiJikokuToInserMax = pCentDedRessya->getCentDedEkiJikoku( iEkiOrderToInsertMin ) ;

					//○[組入れ先駅Order大が始発駅の列車]
					//│組入れ先駅Order小は、そのままとする。
					//↓組入れ先駅Order大は、運行なしとする。
					if ( pCentDedRessya->getSihatsuEki() == iEkiOrderToInsertMax )
					{
						aEkiJikokuToInserMax.setEkiatsukai( CentDedEkiJikoku::Ekiatsukai_None ) ;
					}
					//○[組入れ先駅Index大が中間駅の列車]
					//│ ○組入れ先駅Index小に、組入れ先駅Index大の駅時刻をコピー
					//│ ○組入れ先駅Index小の駅時刻を駅時刻形式(着時刻のみ)に合わせて補正
					//│ ○(組入れ先駅Index小の発時刻をNULLに変更)
					//│ ○組入れ先駅Index大の駅時刻を駅時刻形式(発時刻のみ)に合わせて補正
					//↓ ○(組入れ先駅Index大の着時刻をNULLに変更)
					else if ( pCentDedRessya->getSihatsuEki() < iEkiOrderToInsertMax && 
						iEkiOrderToInsertMax < pCentDedRessya->getSyuuchakuEki() ) 
					{
						aEkiJikokuToInserMin = aEkiJikokuToInserMax ;
					}
					//○[組入れ先駅Index大が終着駅の列車]
					//│組入れ先駅Index小に、駅時刻をコピー
					//↓組入れ先駅Index大は、運行なしとする。
					else if ( pCentDedRessya->getSyuuchakuEki() == iEkiOrderToInsertMax )
					{
						aEkiJikokuToInserMin = aEkiJikokuToInserMax ;
						aEkiJikokuToInserMax.setEkiatsukai( CentDedEkiJikoku::Ekiatsukai_None ) ;
					}

					pCentDedRessya->setCentDedEkiJikoku( iEkiOrderToInsertMin , aEkiJikokuToInserMin ) ;
					pCentDedRessya->setCentDedEkiJikoku( iEkiOrderToInsertMax , aEkiJikokuToInserMax ) ;
				}
			}
		}
		//○組入れ先駅Index小の駅時刻を駅時刻形式に合わせて補正
		//│ ◎駅時刻を駅時刻形式に合わせて補正
		//│   ○[駅時刻形式に着時刻あり・発時刻なし、
		//│    │駅時刻に着時刻なし、発時刻あり]
		//│    ↓着時刻には発時刻をコピー、発時刻はNULL。
		//│    ○[駅時刻形式に着時刻なし・発時刻あり
		//│    │駅時刻に着時刻あり、発時刻なし]
		//│    ↓発時刻には着時刻をコピー、着時刻はNULL。
		//│    ○[駅が始発駅・
		//│    │駅時刻形式に着時刻あり・発時刻あり、
		//│    │駅時刻に着時刻あり、発時刻なし]
		//│    ↓発時刻には着時刻をコピー、着時刻はNULL。
		//│    ○[駅が終着駅・
		//│     駅時刻形式に着時刻あり・発時刻あり
		//│     駅時刻に着時刻なし、発時刻あり]
		//│     着時刻には発時刻をコピー、発時刻はNULL。
		//○組入れ先駅Index大の駅時刻を駅時刻形式に合わせて補正
		adjustByEkijikokukeisiki( iEkiIndexToInsertMin ) ;
		adjustByEkijikokukeisiki( iEkiIndexToInsertMax ) ;
	}
	//○[組入れ先が起点駅]なら、その駅の駅時刻形式は[上り着時刻]とする
	//  ○[組入れ先駅Index小=-1,組入れ先駅Index大=0]
	//    組入れ先駅Index大を上り着時刻とする
	//   ○組入れ先駅Index大の駅時刻を駅時刻形式に合わせて補正
	else if ( iEkiIndexToInsertMin == -1 &&
			iEkiIndexToInsertMax == 0 )
	{
		CentDedEkiCont* pCentDedEkiCont = getCentDedEkiCont() ;
		CentDedEki*	pDedEkiInsert = pCentDedEkiCont->getMuPtr()->get( iEkiIndexToInsertMax ) ;
		pDedEkiInsert->setEkijikokukeisiki( CentDedEki::Jikokukeisiki_NoboriChaku ) ;
		adjustByEkijikokukeisiki( iEkiIndexToInsertMax ) ;
	}
	//○[組入れ先が終点駅]なら、その駅の駅時刻形式は[下り着時刻]とする
	//  ○[組入れ先がIndex小=駅数-1 AND 組入れ先駅Index大=駅数]
	//    組入れ先駅Index小を下り着時刻とする
	//   ○組入れ先駅Index小の駅時刻を駅時刻形式に合わせて補正
	else if ( iEkiIndexToInsertMin == getCentDedEkiCont()->size() - 1 &&
			iEkiIndexToInsertMax == getCentDedEkiCont()->size() ) 
	{
		CentDedEkiCont* pCentDedEkiCont = getCentDedEkiCont() ;
		CentDedEki*	pDedEkiInsert = pCentDedEkiCont->getMuPtr()->get( iEkiIndexToInsertMin ) ;
		pDedEkiInsert->setEkijikokukeisiki( CentDedEki::Jikokukeisiki_KudariChaku ) ;
		adjustByEkijikokukeisiki( iEkiIndexToInsertMin ) ;
	}




	//○駅を追加
	//  ○組入れる路線ファイルの駅をすべて追加する。
	//   追加する駅Indexは、組入れ先駅Index小+1。
	//		○[組入れる路線ファイルの起点駅の駅時刻形式が発着以外]
	//		  その駅の駅時刻形式は[上り着時刻]とする
	//		○[組入れる路線ファイルの終点駅の駅時刻形式が発着以外]
	//		  その駅の駅時刻形式は[下り着時刻]とする
	//  ○組入れ先駅Index大に、追加した駅数を加算
	{
		CentDedEkiCont* pCentDedEkiCont = m_pCentDedEkiCont ;
		const CentDedEkiCont* pCentDedEkiContToAdd = rosenToAdd.getCentDedEkiCont() ;
		for ( int idxEki = 0 ; idxEki < pCentDedEkiContToAdd->size() ; idxEki ++ )
		{
			CentDedEki aEki = *pCentDedEkiContToAdd->getMuPtr()->get( idxEki ) ;
			if ( idxEki == 0 && aEki.getEkijikokukeisiki() != CentDedEki::Jikokukeisiki_Hatsuchaku )
			{
				aEki.setEkijikokukeisiki( CentDedEki::Jikokukeisiki_NoboriChaku ) ;
			}
			else if ( idxEki == pCentDedEkiContToAdd->size() - 1 && 
				aEki.getEkijikokukeisiki() != CentDedEki::Jikokukeisiki_Hatsuchaku )
			{
				aEki.setEkijikokukeisiki( CentDedEki::Jikokukeisiki_KudariChaku ) ;
			}

			pCentDedEkiCont->insert( 
				aEki ,
				iEkiIndexToInsertMin + 1 + idxEki ) ;


			iEkiIndexToInsertMax ++ ;

		}
	}

	//○[組入れ先が中間駅]なら、組入れ先駅Indexが途中駅となる列車は、
	//          追加された駅の駅時刻を経由なしにする。
	if ( 0 < iEkiIndexToInsertMin &&
			iEkiIndexToInsertMax < getCentDedEkiCont()->size() - 1 )
	{
		//  ○全列車のループ
		//    ○下り・上りのループ
		//       ○組入れ先駅Order小・組入れ先駅Order大を求める
		//      ○[始発駅が組入れ先駅Order小より前 AND 
		//       終着駅が組入れ先駅Order大より後]
		//       組入れ先駅Order小+1~組入れ先駅Order大-1の駅扱いを
		//       経由なしにする。
		CentDedDiaCont* pCentDedDiaCont = &m_CentDedDiaCont ;
		int idxDia ;
		for ( idxDia = 0 ; idxDia < pCentDedDiaCont->size() ; idxDia ++ )
		{
			CentDedDia* pCentDedDia = pCentDedDiaCont->getMuPtr()->get( idxDia ) ;
			//○下り列車全列車のループ
			//│ ○組入れ先駅Order小・組入れ先駅Order大を求める
			for ( int iRessyahoukou = Ressyahoukou_Kudari ;
				iRessyahoukou <= Ressyahoukou_Nobori ;
				iRessyahoukou ++ )
			{
				ERessyahoukou eRessyahoukou = (ERessyahoukou)iRessyahoukou ;

				CentDedRessyaCont* pCentDedRessyaCont = pCentDedDia->getCentDedRessyaCont( eRessyahoukou ) ;
				int iEkiOrderToInsertMin = -1 ;
				int iEkiOrderToInsertMax = -1 ;
				{
					int iEkiOrder1 = pCentDedRessyaCont->EkiOrderOfEkiIndex( iEkiIndexToInsertMin ) ;
					int iEkiOrder2 = pCentDedRessyaCont->EkiOrderOfEkiIndex( iEkiIndexToInsertMax ) ;
					iEkiOrderToInsertMin = min( iEkiOrder1 , iEkiOrder2 ) ;
					iEkiOrderToInsertMax = max( iEkiOrder1 , iEkiOrder2 ) ;
				}

				for ( int idxRessya = 0 ; idxRessya < pCentDedRessyaCont->size() ; idxRessya ++ )
				{
					//      ○[始発駅が組入れ先駅Order小より前 AND 
					//       終着駅が組入れ先駅Order大より後]
					//       組入れ先駅Order小+1~組入れ先駅Order大-1の駅扱いを
					//       経由なしにする。
					CentDedRessya* pCentDedRessya = pCentDedRessyaCont->getMuPtr()->get( idxRessya ) ;
					if ( pCentDedRessya->getSihatsuEki() < iEkiOrderToInsertMin && 
						iEkiOrderToInsertMax < pCentDedRessya->getSyuuchakuEki() )
					{

						CentDedEkiJikoku aEkijikokuKeiyunasi( 
							CentDedEkiJikoku::Ekiatsukai_Keiyunasi ,
							CdDedJikoku() , CdDedJikoku() ) ;
						for ( int iEkiOrder = iEkiOrderToInsertMin + 1 ;
							iEkiOrder <= iEkiOrderToInsertMax - 1 ;
							iEkiOrder ++ )
						{
							pCentDedRessya->setCentDedEkiJikoku( iEkiOrder ,aEkijikokuKeiyunasi ) ; 
						}
					}
				}
			}
		}
	}
	//○列車種別のマージ
	//  ○組入れる路線ファイルの列車種別によるループ
	//    ○[同名の列車種別が編集中の路線ファイルに存在しない]列車種別を
	//     編集中の路線ファイルに追加
	//    ○列車種別対照表(組入れる路線ファイルの列車種別Index→
	//     組入れる路線ファイルの列車種別Index の対照表を作成
	deque<int>	arRessyasyubetsuIdx_AddedToThis ;
	{
		CentDedRessyasyubetsuCont* pCentDedRessyasyubetsuCont = this->getCentDedRessyasyubetsuCont() ;
		const CentDedRessyasyubetsuCont* pCentDedRessyasyubetsuContToAdd = rosenToAdd.getCentDedRessyasyubetsuCont() ;
		

		const Mu<const CentDedRessyasyubetsu*>* muCentDedRessyasyubetsuToAdd =
				pCentDedRessyasyubetsuContToAdd->getMuPtr() ;
		for ( int idxToAdd = 0 ; idxToAdd < muCentDedRessyasyubetsuToAdd->size() ; idxToAdd ++ )
		{
			const CentDedRessyasyubetsu* pCentDedRessyasyubetsuToAdd = 
				muCentDedRessyasyubetsuToAdd->get( idxToAdd ) ;

			Mu<CentDedRessyasyubetsu*>* muCentDedRessyasyubetsuThis =
				pCentDedRessyasyubetsuCont->getMuPtr() ;
			int idxThis = 0 ;
			for ( idxThis = 0 ; idxThis < muCentDedRessyasyubetsuThis->size() ; idxThis ++ )
			{
				const CentDedRessyasyubetsu* pCentDedRessyasyubetsuThis = muCentDedRessyasyubetsuThis->get( idxThis ) ;
				if ( pCentDedRessyasyubetsuThis->getSyubetsumei() == 
					pCentDedRessyasyubetsuToAdd->getSyubetsumei() )
				{
					break ;
				}
			}
			//idxThis = 『追加する路線ファイル』の列車種別[idxToAdd] と同名の
			//	thisの列車種別のインデクス。
			//	なければ、  muCentDedRessyasyubetsuThis->size()

			if ( idxThis == muCentDedRessyasyubetsuThis->size() )
			{
				//	同名の種別がない場合は、
				//	this に追加します。
				pCentDedRessyasyubetsuCont->insert( *pCentDedRessyasyubetsuToAdd ) ;
			}
			arRessyasyubetsuIdx_AddedToThis.push_back( idxThis ) ;
		}

	}
	//arRessyasyubetsuIdx_AddedToThis[追加する路線ファイル』の列車種別インデクス] = 
	//	thisの列車種別インデクス

	//○ダイヤのマージ
	//  ○組入れる路線ファイルのダイヤによるループ
	//    ○[同名のダイヤが編集中の路線ファイルに存在しない]空のダイヤを
	//     編集中の路線ファイルに追加
	//    ○ダイヤ対照表(組入れる路線ファイルのダイヤIndex→
	//     組入れる路線ファイルのダイヤIndex の対照表を作成

	deque<int>	arDiaIdx_AddedToThis ;
	{
		CentDedDiaCont* pCentDedDiaCont = this->getCentDedDiaCont() ;
		const CentDedDiaCont* pCentDedDiaContToAdd = rosenToAdd.getCentDedDiaCont() ;
		
		const Mu<const CentDedDia*>* muCentDedDiaToAdd =
				pCentDedDiaContToAdd->getMuPtr() ;
		for ( int idxToAdd = 0 ; idxToAdd < muCentDedDiaToAdd->size() ; idxToAdd ++ )
		{
			const CentDedDia* pCentDedDiaToAdd = 
				muCentDedDiaToAdd->get( idxToAdd ) ;

			Mu<CentDedDia*>* muCentDedDiaThis =
				pCentDedDiaCont->getMuPtr() ;
			int idxThis = 0 ;
			for ( idxThis = 0 ; idxThis < muCentDedDiaThis->size() ; idxThis ++ )
			{
				const CentDedDia* pCentDedDiaThis = muCentDedDiaThis->get( idxThis ) ;
				if ( pCentDedDiaThis->getName() == 
					pCentDedDiaToAdd->getName() )
				{
					break ;
				}
			}
			//idxThis = 『追加する路線ファイル』の列車種別[idxToAdd] と同名の
			//	thisの列車種別のインデクス。
			//	なければ、  muCentDedDiaThis->size()

			if ( idxThis == muCentDedDiaThis->size() )
			{
				//	同名の種別がない場合は、
				//	this に
				//	列車が空のダイヤを追加します。
				//	(ダイヤオブジェクトを直接追加すると、列車も追加されるため、
				//	うまくいきません) 
				CentDedEkiCont* pCentDedEkiCont = this->getCentDedEkiCont() ;
				CentDedRessyasyubetsuCont* pCentDedRessyasyubetsuCont = this->getCentDedRessyasyubetsuCont() ;
				CentDedDia	diaNew( pCentDedEkiCont->size() , pCentDedRessyasyubetsuCont->size() ) ;
				diaNew.setName( pCentDedDiaToAdd->getName() ) ;
				pCentDedDiaCont->insert( diaNew ) ;
			}
			arDiaIdx_AddedToThis.push_back( idxThis ) ;
		}

	}
	//arDiaIdx_AddedToThis[追加する路線ファイル』のダイヤインデクス] = 
	//	thisのダイヤインデクス

	//○組入れる路線ファイルの列車を、編集中の路線ファイルに追加
	//  ○組入れる路線ファイルのダイヤによるループ
	//    ○全列車のループ
	//      ○列車を追加。
	//       追加するダイヤは、ダイヤ対照表にしたがって変換
	//       列車種別Indexは、列車種別対照表に従って変換
	//
	{
		const Mu<const CentDedDia*>* muCentDedDiaToAdd =
			((const CentDedDiaCont*)rosenToAdd.getCentDedDiaCont())->getMuPtr() ;

		for ( int idxDiaToAdd = 0 ; idxDiaToAdd < muCentDedDiaToAdd->size() ; idxDiaToAdd ++ )
		{
			const CentDedDia* pCentDedDiaToAdd = muCentDedDiaToAdd->get( idxDiaToAdd ) ;

			Mu<CentDedDia*>* muCentDedDiaThis =	this->getCentDedDiaCont()->getMuPtr() ;
			CentDedDia* pCentDedDiaThis = muCentDedDiaThis->get( arDiaIdx_AddedToThis[idxDiaToAdd] ) ;
			//pCentDedDiaThis = 列車のコピー先となる CentDedDia ;

			//下り列車→上り列車
			for ( int idxRessyahoukou = (int)Ressyahoukou_Kudari ;
				idxRessyahoukou <= (int)Ressyahoukou_Nobori ;
				idxRessyahoukou ++ )
			{

				ERessyahoukou eRessyahoukou = (ERessyahoukou)idxRessyahoukou ;
				const CentDedRessyaCont* pCentDedRessyaContToAdd = pCentDedDiaToAdd->getCentDedRessyaCont( eRessyahoukou ) ;
				const Mu<const CentDedRessya*>* muCentDedRessyaToAdd = pCentDedRessyaContToAdd->getMuPtr() ;
				CentDedRessyaCont* pCentDedRessyaContThis = pCentDedDiaThis->getCentDedRessyaCont( eRessyahoukou ) ;

				int iEkiOrderToInsert = -1 ;
				if ( eRessyahoukou == Ressyahoukou_Kudari )
				{
					iEkiOrderToInsert = pCentDedRessyaContThis->EkiOrderOfEkiIndex( iEkiIndexToInsertMin + 1 ) ;
				}
				else
				{
					iEkiOrderToInsert = pCentDedRessyaContThis->EkiOrderOfEkiIndex( iEkiIndexToInsertMax - 1 ) ;
				}
				//iEkiOrderToInsert = 組入れる路線ファイルの駅Order0の列車を挿入する、
				//	thisの駅Order

				for ( int idxRessyaToAdd = 0 ; idxRessyaToAdd < muCentDedRessyaToAdd->size() ; idxRessyaToAdd ++ )
				{
					//	現在編集中の路線ファイルに、組入れる路線ファイルの列車を挿入
					//	列車種別・駅時刻は、このあとに修正
					const CentDedRessya* pRessyaToAdd = muCentDedRessyaToAdd->get( idxRessyaToAdd ) ;
					pCentDedRessyaContThis->insert( *pRessyaToAdd ) ;
					CentDedRessya* pRessyaAdded = pCentDedRessyaContThis->getMuPtr()->get( INT_MAX ) ;
					//pRessyaAdded = 組入れる路線ファイルに追加された列車
					//	列車種別・駅時刻は、このあとに修正

					//	列車種別インデクスを、
					//	現在編集中の路線ファイルに合わせて更新。
					pRessyaAdded->setRessyasyubetsuIndex( 
						arRessyasyubetsuIdx_AddedToThis[ pRessyaToAdd->getRessyasyubetsuIndex() ] ) ;

					//	駅時刻を修正
					for ( int iEkiOrder = 0 ; iEkiOrder < pCentDedRessyaContThis->getEkiCount() ; iEkiOrder ++ )
					{
						int iEkiOrderToAdd = iEkiOrder - iEkiOrderToInsert ;
						//iEkiOrderToAdd = thisのiEkiOrderに対応する、
						//	組入れる路線ファイルの駅Order

						if ( 0 <= iEkiOrderToAdd && iEkiOrderToAdd < pCentDedRessyaContToAdd->getEkiCount() )
						{
							//	組入れる路線ファイルの駅Orderに対応する場合は、
							//	組入れる路線ファイルの駅時刻をコピー
							CentDedEkiJikoku aEkiJikokuToAdd = pRessyaToAdd->getCentDedEkiJikoku( iEkiOrderToAdd ) ; 
							pRessyaAdded->setCentDedEkiJikoku( iEkiOrder , aEkiJikokuToAdd ) ; 
						}
						else
						{
							//	組入れる路線ファイルの駅Orderに対応しない駅に対しては、
							//	運行なしを設定
							pRessyaAdded->setCentDedEkiJikoku( iEkiOrder , CentDedEkiJikoku() ) ; 
						}
					}


				}
			}	
		}
	}


	//○[組入れ先駅Index小と組入れ先駅Index小+1で、駅名が同一]駅を併合
	if ( 0 <= iEkiIndexToInsertMin )
	{
		CentDedEkiCont* pCentDedEkiContThis = getCentDedEkiCont() ;
		CentDedEki*	pEkiToInsertMin = pCentDedEkiContThis->getMuPtr()->get( iEkiIndexToInsertMin ) ;
		CentDedEki*	pEkiToInsertMin_1 = pCentDedEkiContThis->getMuPtr()->get( iEkiIndexToInsertMin + 1 ) ;
		if ( pEkiToInsertMin->getEkimei() == pEkiToInsertMin_1->getEkimei() )
		{
			//  ○組入れ先駅Index小の駅時刻形式を発着に変更
			pEkiToInsertMin->setEkijikokukeisiki( CentDedEki::Jikokukeisiki_Hatsuchaku ) ;

			//  ○全ダイヤのループ
			//        ○全下り列車のループ
			//      ○[組入れ先駅Index小が運行なし]
			//       組入れ先駅Index小+1の駅時刻を組入れ先駅Index小にコピー
			//    ○全上り列車のループ
			//      ○[組入れ先駅Index小が運行なし]
			//       組入れ先駅Index小+1の駅時刻を組入れ先駅Index小にコピー
			CentDedDiaCont* pCentDedDiaCont = this->getCentDedDiaCont() ;
			for ( int idxDia = 0 ; idxDia < pCentDedDiaCont->size() ; idxDia ++ )
			{
				CentDedDia* pDia = pCentDedDiaCont->getMuPtr()->get( idxDia ) ;
				for ( int iRessyahoukou = Ressyahoukou_Kudari ;
					iRessyahoukou <= Ressyahoukou_Nobori ;
					iRessyahoukou ++ )
				{
					ERessyahoukou eRessyahoukou = (ERessyahoukou)iRessyahoukou ;

					CentDedRessyaCont* pRessyaCont = pDia->getCentDedRessyaCont( eRessyahoukou ) ;
					int iEkiOrderToInsertMin = pRessyaCont->EkiOrderOfEkiIndex( iEkiIndexToInsertMin ) ;
					int iEkiOrderToInsertMin_1 = pRessyaCont->EkiOrderOfEkiIndex( iEkiIndexToInsertMin + 1 ) ;
					for ( int idxRessya = 0 ; idxRessya < pRessyaCont->size() ; idxRessya ++ )
					{
						CentDedRessya* pRessya = pRessyaCont->getMuPtr()->get( idxRessya ) ;
						
						CentDedEkiJikoku aEkijikoku = pRessya->getCentDedEkiJikoku( iEkiOrderToInsertMin ) ;
						if ( aEkijikoku.getEkiatsukai() == CentDedEkiJikoku::Ekiatsukai_None )
						{
							aEkijikoku = pRessya->getCentDedEkiJikoku( iEkiOrderToInsertMin_1 ) ;
							pRessya->setCentDedEkiJikoku( iEkiOrderToInsertMin ,aEkijikoku ) ;
						}
					}
				}
			}
			//  ○組入れ先駅Index小+1の駅を削除
			pCentDedEkiContThis->erase( iEkiIndexToInsertMin + 1 ) ;
			iEkiIndexToInsertMax -- ;
		}
	}

	//○[組入れ先駅Index大と組入れ先駅Index大-1で、駅名が同一]駅を併合
	if ( iEkiIndexToInsertMax < getCentDedEkiCont()->size() - 1 )
	{
		CentDedEkiCont* pCentDedEkiContThis = getCentDedEkiCont() ;
		CentDedEki*	pEkiToInsertMax = pCentDedEkiContThis->getMuPtr()->get( iEkiIndexToInsertMax ) ;
		CentDedEki*	pEkiToInsertMax_1 = pCentDedEkiContThis->getMuPtr()->get( iEkiIndexToInsertMax - 1 ) ;
		if ( pEkiToInsertMax->getEkimei() == pEkiToInsertMax_1->getEkimei() )
		{
			//○組入れ先駅Index大の駅時刻形式を発着に変更
			pEkiToInsertMax->setEkijikokukeisiki( CentDedEki::Jikokukeisiki_Hatsuchaku ) ;
			//○全ダイヤのループ
			//  ○全下り列車のループぴ
			//    ○[組入れ先駅Index大が運行なし]
			//     組入れ先駅Index大-1の駅時刻を組入れ先駅Index大にコピー
			//  ○全上り列車のループぴ
			//    ○[組入れ先駅Index大が運行なし]
			//     組入れ先駅Index大-1の駅時刻を組入れ先駅Index大にコピー
			CentDedDiaCont* pCentDedDiaCont = this->getCentDedDiaCont() ;
			for ( int idxDia = 0 ; idxDia < pCentDedDiaCont->size() ; idxDia ++ )
			{
				CentDedDia* pDia = pCentDedDiaCont->getMuPtr()->get( idxDia ) ;
				for ( int iRessyahoukou = Ressyahoukou_Kudari ;
					iRessyahoukou <= Ressyahoukou_Nobori ;
					iRessyahoukou ++ )
				{
					ERessyahoukou eRessyahoukou = (ERessyahoukou)iRessyahoukou ;

					CentDedRessyaCont* pRessyaCont = pDia->getCentDedRessyaCont( eRessyahoukou ) ;
					int iEkiOrderToInsertMax = pRessyaCont->EkiOrderOfEkiIndex( iEkiIndexToInsertMax ) ;
					int iEkiOrderToInsertMax_1 = pRessyaCont->EkiOrderOfEkiIndex( iEkiIndexToInsertMax - 1 ) ;
					for ( int idxRessya = 0 ; idxRessya < pRessyaCont->size() ; idxRessya ++ )
					{
						CentDedRessya* pRessya = pRessyaCont->getMuPtr()->get( idxRessya ) ;
						
						CentDedEkiJikoku aEkijikoku = pRessya->getCentDedEkiJikoku( iEkiOrderToInsertMax ) ;
						if ( aEkijikoku.getEkiatsukai() == CentDedEkiJikoku::Ekiatsukai_None )
						{
							aEkijikoku = pRessya->getCentDedEkiJikoku( iEkiOrderToInsertMax_1 ) ;
							pRessya->setCentDedEkiJikoku( iEkiOrderToInsertMax ,aEkijikoku ) ;
						}
					}
				}
			}
			//  ○組入れ先駅Index大-1の駅を削除
			pCentDedEkiContThis->erase( iEkiIndexToInsertMax - 1 ) ;
			iEkiIndexToInsertMax -- ;
		}
	}
	//○、『追加する路線ファイル』のコメントを、『現在編集している路線ファイル』のコメントの末尾に追加。
	{
		string strComment = this->getComment() ;
		strComment += "\n\n" ;
		strComment += rosenToAdd.getComment() ;
		this->setComment( strComment ) ;
	}
}
예제 #7
0
	// ********************************
	//@name 包含-CentDedRessyasyubetsu
	// ********************************
int CentDedRosen::swapRessyasyubetsu( int iRessyasyubetsuIndexA ,
		int iRessyasyubetsuIndexB ) 
{
	int iRv = 0 ;
	// --------------------------------
	if ( iRv >= 0 ){
		if ( iRessyasyubetsuIndexA == INT_MAX ){
			iRessyasyubetsuIndexA = m_pCentDedRessyasyubetsuCont->size() - 1 ;
		}
		if ( !( 0 <= iRessyasyubetsuIndexA && 
				iRessyasyubetsuIndexA < m_pCentDedRessyasyubetsuCont->size() ) ){
			iRv = -1 ;	//	インデクスが不正

		}
	}
	if ( iRv >= 0 ){
		if ( iRessyasyubetsuIndexB == INT_MAX ){
			iRessyasyubetsuIndexB = m_pCentDedRessyasyubetsuCont->size() - 1 ;
		}
		if ( !( 0 <= iRessyasyubetsuIndexB && 
				iRessyasyubetsuIndexB < m_pCentDedRessyasyubetsuCont->size() ) ){
			iRv = -1 ;	//	インデクスが不正

		}
	}
	if ( iRv >= 0 ){
		if ( iRessyasyubetsuIndexA == iRessyasyubetsuIndexB ){
			iRv = -1 ;	//	インデクスが不正
		}
	}
	// --------------------------------
	//m_CentDedRessyasyubetsuCont の入れ替え
	if ( iRv >= 0 ){
		Mu<CentDedRessyasyubetsu*>*	pIfContGet = m_pCentDedRessyasyubetsuCont->getMuPtr() ;
		CentDedRessyasyubetsu	aCentDedRessyasyubetsuA = 
			*pIfContGet->get( iRessyasyubetsuIndexA ) ;
		CentDedRessyasyubetsu	aCentDedRessyasyubetsuB = 
			*pIfContGet->get( iRessyasyubetsuIndexB ) ;
		*pIfContGet->get( iRessyasyubetsuIndexA )  = 
			aCentDedRessyasyubetsuB ; 
		*pIfContGet->get( iRessyasyubetsuIndexB )  = 
			aCentDedRessyasyubetsuA ; 

		// --------------------------------
		//	列車の入れ替え
		// --------------------------------
		int iDiaIndex ;
		for ( iDiaIndex = 0 ; iDiaIndex < m_CentDedDiaCont.size() ; iDiaIndex ++ ){
			CentDedDia*	pCentDedDia = m_CentDedDiaCont.getMuPtr()->get( iDiaIndex ) ;
			int iRessyahoukou = 0 ;
			for ( iRessyahoukou = Ressyahoukou_Kudari ; 
					iRessyahoukou <= Ressyahoukou_Nobori ; 
					iRessyahoukou ++ ){
				ERessyahoukou	eRessyahoukou = (ERessyahoukou)iRessyahoukou ;
				
				CentDedRessyaCont* pCentDedRessyaCont = pCentDedDia->getCentDedRessyaCont( eRessyahoukou ) ;
				Mu< CentDedRessya* >* pCentDedRessyaContGet = pCentDedRessyaCont->getMuPtr() ;

				int iRessyaCount = pCentDedRessyaContGet->size() ;

				int iRessyaIndex ;
				//	iRessyasyubetsuIndexA -> -1 (仮の値)
				//	iRessyasyubetsuIndexB -> iRessyasyubetsuIndexA (仮の値)
				for ( iRessyaIndex = 0 ; 
						iRessyaIndex < iRessyaCount ; 
						iRessyaIndex ++ ){
					CentDedRessya*	pCentDedRessya = pCentDedRessyaContGet->get( iRessyaIndex ) ;
					
					int iRessyasyubetsuIndexCurr = pCentDedRessya->getRessyasyubetsuIndex() ;
					if ( iRessyasyubetsuIndexCurr == iRessyasyubetsuIndexA ){
						iRessyasyubetsuIndexCurr = -1 ;	//	仮の値
					}	else if ( iRessyasyubetsuIndexCurr == iRessyasyubetsuIndexB ){
						iRessyasyubetsuIndexCurr = iRessyasyubetsuIndexA ;
					}
					pCentDedRessya->setRessyasyubetsuIndex( iRessyasyubetsuIndexCurr ) ;	
				}
				//	-1 (仮の値) ->iRessyasyubetsuIndexA 
				for ( iRessyaIndex = 0 ; 
						iRessyaIndex < iRessyaCount ; 
						iRessyaIndex ++ ){
					CentDedRessya*	pCentDedRessya = pCentDedRessyaContGet->get( iRessyaIndex ) ;
					
					int iRessyasyubetsuIndexCurr = pCentDedRessya->getRessyasyubetsuIndex() ;
					if ( iRessyasyubetsuIndexCurr == -1 ){	//	仮の値
						iRessyasyubetsuIndexCurr = iRessyasyubetsuIndexB ;
					}
					pCentDedRessya->setRessyasyubetsuIndex( iRessyasyubetsuIndexCurr ) ;	
				}
			}
		}
	}

	return ( iRv ) ;
}
예제 #8
0
CentDedRosen CentDedRosen::createSubRosen( 
		int iEkiIndex , int iEkiCount )const 
{
	CentDedRosen rosenNew = *this ;
	/*	
	(1) 新しく生成される路線ファイルは、
	『現在編集している路線ファイル』から、
	指定された範囲以外の駅を削除したものになります。
	*/
	{
		//	『新しく生成される路線ファイル』の終点側の駅を削除
		rosenNew.getCentDedEkiCont()->erase( iEkiIndex + iEkiCount , INT_MAX ) ;
		//	『新しく生成される路線ファイル』の起点側の駅を削除
		rosenNew.getCentDedEkiCont()->erase( 0 , iEkiIndex ) ;
	}
	/*
	(2) 新しく生成される路線が運転区間に含まれない列車は、削除します。
	*/
	{
		Mu<CentDedDia*>* muCentDedDia = rosenNew.getCentDedDiaCont()->getMuPtr() ;

		for ( int idxDia = 0 ; idxDia < muCentDedDia->size() ; idxDia ++ )
		{
			CentDedDia* pCentDedDia = muCentDedDia->get( idxDia ) ;
			//pCentDedDia = 対象となるダイヤ

			//下り列車→上り列車
			for ( int idxRessyahoukou = (int)Ressyahoukou_Kudari ;
				idxRessyahoukou <= (int)Ressyahoukou_Nobori ;
				idxRessyahoukou ++ )
			{
				ERessyahoukou eRessyahoukou = (ERessyahoukou)idxRessyahoukou ;
				CentDedRessyaCont* pCentDedRessyaCont = pCentDedDia->getCentDedRessyaCont( eRessyahoukou ) ;

				for ( int idxRessya = 0 ; idxRessya < pCentDedRessyaCont->size() ; idxRessya ++ )
				{
					bool bErase = false ;
					CentDedRessya* pRessya = pCentDedRessyaCont->getMuPtr()->get( idxRessya ) ;

					//	列車が運行している区間が一つもない列車は、
					//	削除します。
					if ( !bErase )
					{

						//	列車が運行している区間の最初の駅Orderを
						//	検索します。
						int iEkiOrder = 0 ;
						for ( iEkiOrder = 0 ; 
							iEkiOrder < pRessya->getCentDedEkiJikokuCount() ;
							iEkiOrder ++ )
						{
							if ( pRessya->isRunBetweenNextEki( iEkiOrder ) )
							{
								break ;
							}
						}
						//iEkiOrder = 列車が運行している区間の最初の駅Order
						//	見つからなかった場合は、
						//	pRessya->getCentDedEkiJikokuCount() と等しくなります。
						if ( iEkiOrder == pRessya->getCentDedEkiJikokuCount() )
						{
							bErase = true ;	
						}
					}


					//	列車を削除
					if ( bErase )
					{
						pCentDedRessyaCont->erase( idxRessya ) ;
						idxRessya -- ;
					}
				}
			}

		}
	}


	return rosenNew ;
}
예제 #9
0
int CentDedDgrRessya::updateRessyasenCont_02_calcRessyasenSyuuten( 
		int iRessyasenKitenEkiOrder ,
		int* piRessyasenSyuutenEkiOrder ) 
{
	int iRv = 0 ;
	Mu<CentDedDgrEkiJikoku*>*	pMuCentDedDgrEkiJikoku 
		= this->getMuCentDedDgrEkiJikoku() ;

	int iSyuuchakuEki = getSyuuchakuEki()  ;
	int iRessyasenSyuutenEkiOrder = -1 ;

	//	  (1) 『列車線終点駅Order』の条件は、
	//「着時刻・発時刻の両方が指定されている」 OR
	//「 次の駅の駅扱いが『運行なし』 」 OR
	//「「『駅Order』が、その列車におけるの終着駅」 
	//	  対象駅がみつからなければ、列車線終点駅Orderの決定は失敗となります
	//  (経由なしの直前は、列車線の終点にはなりません
	//   (この時点での列車線起点と終点は、経由なしをまたぐことがあります。)

	if ( iRv >= 0 )
	{
		for ( int iEkiOrder = iRessyasenKitenEkiOrder + 1 ; 
			iRessyasenSyuutenEkiOrder < 0 && 
				iEkiOrder <= iSyuuchakuEki ;
			iEkiOrder ++ )
		{
			CentDedDgrEkiJikoku	aEkiJikokuCurr = 
				*pMuCentDedDgrEkiJikoku->get( iEkiOrder ) ;
			CentDedDgrEkiJikoku	aEkiJikokuNext ;
			if ( iEkiOrder + 1 < pMuCentDedDgrEkiJikoku->size() )
			{
				aEkiJikokuNext = 
					*pMuCentDedDgrEkiJikoku->get( iEkiOrder + 1 ) ;
			}
			//aEkijikokuCurr = iEkiOrder の駅時刻
			//aEkiJikokuNext = iEkiOder の次の駅の駅時刻。
			//	iEkiOrderが終着駅の場合は、NULLとなります。


			int jikokuChaku = aEkiJikokuCurr.getDgrXPosChaku( false ) ;
			int	jikokuHatsu = aEkiJikokuCurr.getDgrXPosHatsu( false ) ;
			if ( jikokuChaku != INT_MIN && jikokuHatsu != INT_MIN )
			{
				//「着時刻・発時刻の両方が指定されている」 
				iRessyasenSyuutenEkiOrder = iEkiOrder ;
			}
			else if ( aEkiJikokuNext.getEkiatsukai() == 
						CentDedEkiJikoku::Ekiatsukai_None ) 
			{
				//	「次の駅の駅扱いが『運行なし』」  
				iRessyasenSyuutenEkiOrder = iEkiOrder ;
			}
			else if ( iEkiOrder == iSyuuchakuEki )
			{
				//	「「『駅Order』が、その列車におけるの終着駅」 
				iRessyasenSyuutenEkiOrder = iEkiOrder ;
			}
		}
		if ( iRessyasenSyuutenEkiOrder < 0 )
		{
			iRv = -1 ;	//	列車線終点が決定できません。(通常は発生しません)
		}
	}
	// iRessyasenSyuutenEkiOrder = 仮決定した列車線終点駅Order

	//	(2) この時点で、『列車線終点駅Order』に着時刻も発時刻も
	//	設定されていない場合は、
	//	始発駅方向に向かって、着時刻・発時刻のいずれかが指定されている
	//	駅を検索します。
	//	  この結果『列車線終点駅Order』に相当する駅がない場合は、
	//	列車線終点駅Orderの決定は失敗となります。
	if ( iRv >= 0 )
	{
		for ( ; iRessyasenSyuutenEkiOrder > iRessyasenKitenEkiOrder ; 
			iRessyasenSyuutenEkiOrder -- )
		{
			CentDedDgrEkiJikoku	aEkiJikokuCurr = 
				*pMuCentDedDgrEkiJikoku->get( iRessyasenSyuutenEkiOrder ) ;
			int jikokuChaku = aEkiJikokuCurr.getDgrXPosChaku( false ) ;
			int	jikokuHatsu = aEkiJikokuCurr.getDgrXPosHatsu( false ) ;
			if ( jikokuChaku != INT_MIN || jikokuHatsu != INT_MIN )
			{
				//「着時刻・発時刻のどちらかが指定されている」 
				break ;
			}
		}
		if ( iRessyasenSyuutenEkiOrder == iRessyasenKitenEkiOrder )
		{
			iRv = -1 ;	//	列車線終点が決定できません。
		}
		//iRessyasenSyuutenEkiOrder = 
		//	着時刻・発時刻のいずれかが指定された、『列車線終点駅Order』
	}
	// --------------------------------
	if ( iRv >= 0 )
	{
		*piRessyasenSyuutenEkiOrder = iRessyasenSyuutenEkiOrder ;
	}
	return ( iRv ) ;
}
예제 #10
0
		/**
		@return
			*m_pCentDedRessyaCont->get(idxleft ) < *m_pCentDedRessyaCont->get(idxright ) 
			なら真です。

		@note
		  比較基準は、
			- NULLでないものとNULLのものとでは、NULLでないものが先。
			- 列車種別Indexの小さいほうが先。
			- 列車名が辞書順で早い方が先。
			- 号数の長さが短い方が先。
			- 号数が辞書順で早い方が先。
			- 列車番号の長さが短い方が先。
			- 列車番号が辞書順で早い方が先。
			- 列車Indexの小さい方が先。
		*/
		bool operator()( 
			int idxleft , 
			int idxright )
		{
			const CentDedRessya& left  = *m_pCentDedRessyaCont->get(idxleft ) ;
			const CentDedRessya& right = *m_pCentDedRessyaCont->get(idxright ) ;
			// --------------------------------
			//	片方がNULLの場合の比較
			//	- NULLでないものとNULLのものとでは、NULLでないものが先。
			// --------------------------------
			if ( !left.isNull() && right.isNull() )
			{
				//	leftはNULLで、rightは非NULL
				return true ;
			}
			else if ( left.isNull() && !right.isNull() )
			{
				//	leftは非NULLで、rightはNULL
				return false ;
			}
			// --------------------------------
			//	- 列車種別Indexの小さいほうが先。
			// --------------------------------
			if ( left.getRessyasyubetsuIndex() < right.getRessyasyubetsuIndex() )
			{
				return true ;
			}
			else if ( left.getRessyasyubetsuIndex() > right.getRessyasyubetsuIndex() )
			{
				return false ;
			}

			// --------------------------------
			//	- 列車名が辞書順で早い方が先。
			// --------------------------------
			if ( left.getRessyamei() < right.getRessyamei() )
			{
				return true ;
			}
			else if ( left.getRessyamei() > right.getRessyamei() )
			{
				return false ;
			}

			//// --------------------------------
			////	- 号数を整数化した場合に早い方が先。
			//// --------------------------------
			//{
			//	int iLeftGousuu = OuLib::intOf( left.getGousuu() ) ;
			//	int iRightGousuu = OuLib::intOf( right.getGousuu() ) ;
			//	if ( iLeftGousuu < iRightGousuu )
			//	{
			//		return true ;
			//	}
			//	else if ( iLeftGousuu > iRightGousuu )
			//	{
			//		return false ;
			//	}
			//}

			// --------------------------------
			//	- 号数の長さが短い方が先。
			// --------------------------------
			{
				if ( left.getGousuu().length()  < right.getGousuu().length() )
				{
					return true ;
				}
				else if ( left.getGousuu().length() > right.getGousuu().length() )
				{
					return false ;
				}
			}
			// --------------------------------
			//	- 号数が辞書順で早い方が先。
			// --------------------------------
			{
				if ( left.getGousuu()  < right.getGousuu() )
				{
					return true ;
				}
				else if ( left.getGousuu() > right.getGousuu() )
				{
					return false ;
				}
			}
			// --------------------------------
			//	- 列車番号の長さが短い方が先。
			// --------------------------------
			{
				if ( left.getRessyabangou().length()  < right.getRessyabangou().length() )
				{
					return true ;
				}
				else if ( left.getRessyabangou().length() > right.getRessyabangou().length() )
				{
					return false ;
				}
			}
			// --------------------------------
			//	- 列車番号が辞書順で早い方が先。
			// --------------------------------
			{
				if ( left.getRessyabangou()  < right.getRessyabangou() )
				{
					return true ;
				}
				else if ( left.getRessyabangou() > right.getRessyabangou() )
				{
					return false ;
				}
			}
			// --------------------------------
			//	- 列車Indexの小さいほうが先。
			// --------------------------------
			if ( idxleft < idxright )
			{
				return true ;
			}
			return false ;
		}