Пример #1
0
CentDedEkiCont::CdDedEki CentDedEkiCont::ContNobori::get(int iEkiOrder )const 
{
	CentDedEkiCont* pAdaptee = (CentDedEkiCont*)( (char*)this - offsetof( CentDedEkiCont , CentDedEkiCont::m_xContNobori ) ) ;
	
	int iEkiIndex = pAdaptee->EkiIndexOfEkiOrder( Ressyahoukou_Nobori , iEkiOrder ) ;
	CentDedEki aCentDedEki = pAdaptee->get( iEkiIndex ) ;

	CentDedEki aCentDedEkiPrev ;
	if ( iEkiIndex > 0 ){
		aCentDedEkiPrev = pAdaptee->get( iEkiIndex - 1 ) ;
	}

	CentDedEkiCont::CdDedEki aCdDedEki( 
		aCentDedEki.getEkimei() , 
		aCentDedEki.getEkijikokukeisiki() == CentDedEki::Jikokukeisiki_Hatsuchaku || 
		aCentDedEki.getEkijikokukeisiki() == CentDedEki::Jikokukeisiki_NoboriChaku , 
		aCentDedEki.getEkijikokukeisiki() == CentDedEki::Jikokukeisiki_Hatsuchaku || 
		aCentDedEki.getEkijikokukeisiki() == CentDedEki::Jikokukeisiki_Hatsu || 
		aCentDedEki.getEkijikokukeisiki() == CentDedEki::Jikokukeisiki_KudariChaku ,
		aCentDedEki.getEkikibo() ,
		aCentDedEkiPrev.getKyoukaisen() , 
		aCentDedEki.getDiagramRessyajouhouHyoujiNobori() ) ;

	return ( aCdDedEki ) ;
	
}
Пример #2
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 ) ;
	}
}
Пример #3
0
void CentDedRosen::invert()
{
	//(0) 路線オブジェクトのコピーを作成
	CentDedRosen	aRosenBefore = *this ;


	//(1) 路線ファイルの駅の順序の並び順を逆にします。
	//	最初の状態の路線ファイルのコピーから、駅属性をコピーします。
	{
		for ( int idxEki = 0 ;idxEki < m_pCentDedEkiCont->size() ; idxEki ++ )
		{
			CentDedEki	aEki = aRosenBefore.getCentDedEkiCont()->get( 
				m_pCentDedEkiCont->size() - idxEki - 1 ) ;

			m_pCentDedEkiCont->set( aEki , idxEki ) ;
		}
	}
	//(2) 駅のプロパティは、以下の変換を行います。
	//
	//	駅時刻形式を変更すると、
	//	このため、一旦駅時刻をコピーしてから、駅時刻を変更することにしています。
	{
		for ( int idxEki = 0 ; idxEki < m_pCentDedEkiCont->size() ; idxEki ++ )  
		{
			CentDedEki*	pEki = m_pCentDedEkiCont->getMuPtr()->get( idxEki ) ;

			//(2.1)駅名はそのまま

			//(2.2)駅時刻形式
			//	- 下り着時刻→上り着時刻
			//	- 上り着時刻→下り着時刻
			{
				CentDedEki::EEkijikokukeisiki eEkijikokukeisiki = pEki->getEkijikokukeisiki() ;
				if ( eEkijikokukeisiki == CentDedEki::Jikokukeisiki_KudariChaku )
				{
					eEkijikokukeisiki = CentDedEki::Jikokukeisiki_NoboriChaku ;
				}
				else if ( eEkijikokukeisiki == CentDedEki::Jikokukeisiki_NoboriChaku )
				{
					eEkijikokukeisiki = CentDedEki::Jikokukeisiki_KudariChaku ;
				}
				pEki->setEkijikokukeisiki( eEkijikokukeisiki ) ;
			}

			//(2.3)境界線
			//	- 駅の順序を変更後、起点側(駅Indexの小さい側)に1駅シフトする。
			//	- 新しい下り側終点(駅Indexの最も大きい駅)の境界線は無しにする。
			{
				CentDedEki*	pEkiNext = NULL ;
				if ( idxEki + 1 < m_pCentDedEkiCont->size() )
				{
					pEkiNext = m_pCentDedEkiCont->getMuPtr()->get( idxEki + 1 ) ;
				}

				if ( pEkiNext != NULL )
				{
					pEki->setKyoukaisen( pEkiNext->getKyoukaisen() ) ;
				}
				else
				{
					pEki->setKyoukaisen( false ) ;
				}
			}

			//(2.4)ダイヤグラム列車情報
			//	  下りの内容と上りの内容を入れ替えます。
			{
				CentDedEki::EDiagramRessyajouhouHyouji eRessyajouhouHyoujiKudari = pEki->getDiagramRessyajouhouHyoujiKudari() ;
				CentDedEki::EDiagramRessyajouhouHyouji eRessyajouhouHyoujiNobori = pEki->getDiagramRessyajouhouHyoujiNobori() ;
				pEki->setDiagramRessyajouhouHyoujiKudari( eRessyajouhouHyoujiNobori ) ;
				pEki->setDiagramRessyajouhouHyoujiNobori( eRessyajouhouHyoujiKudari ) ;
			}
		}
	}

	//(3)すべてのダイヤについて、下り列車と上り列車を入れ替えます。
	//	このとき、下り列車を一旦空にしたうえで、
	//	最初の状態(駅の順序の入れ替えを行う前に)の路線オブジェクトのコピーから
	//	列車を挿入します。上りも同様です。
	//【補足】
	//	this の駅の属性を変更すると、含まれている列車の着時刻・発時刻は
	//	『始発駅・終着駅の駅時刻形式変更に伴う、着時刻・発時刻の修正』
	//	により、駅時刻が変更されます。
	//	当機能では、それを避ける必要があります。
	{
		for ( int idxDia = 0 ; idxDia < m_CentDedDiaCont.size() ; idxDia ++ )
		{
			CentDedDia* pDia = m_CentDedDiaCont.getMuPtr()->get( idxDia ) ;

			//	下り・上りの列車コンテナにアダプタを付加
			CaMui<CentDedRessya>	aRessyaContKudariAdapter( pDia->getCentDedRessyaCont( Ressyahoukou_Kudari ) ) ;
			CaMui<CentDedRessya>	aRessyaContNoboriAdapter( pDia->getCentDedRessyaCont( Ressyahoukou_Nobori ) ) ;

			//	下り列車コンテナの内容を削除後、
			//	かつての上り列車のコピーを追加
			aRessyaContKudariAdapter.getAdaptee()->erase( 0 , INT_MAX ) ;
			aRessyaContKudariAdapter.insert( 
				aRosenBefore.getCentDedDiaCont()->getMuPtr()->get( idxDia )->getCentDedRessyaCont( Ressyahoukou_Nobori ) );

			//	上り列車コンテナの内容を削除後、
			//	かつての上り列車のコピーを追加
			aRessyaContNoboriAdapter.getAdaptee()->erase( 0 , INT_MAX ) ;
			aRessyaContNoboriAdapter.insert( 
				aRosenBefore.getCentDedDiaCont()->getMuPtr()->get( idxDia )->getCentDedRessyaCont( Ressyahoukou_Kudari ) );

		}
	}

/*
	//(3)路線ファイルに含まれるすべての列車の駅時刻の並び順を逆にします。
	{
		for ( int idxDia = 0 ; idxDia < m_CentDedDiaCont.size() ; idxDia ++ )
		{
			CentDedDia* pDia = m_CentDedDiaCont.getMuPtr()->get( idxDia ) ;

			//	ダイヤ内の下り・上りすべての列車
			for ( int iRessyahoukou = (int)Ressyahoukou_Kudari ;
				iRessyahoukou <= (int)Ressyahoukou_Nobori ;
				iRessyahoukou ++ )
			{
				ERessyahoukou eRessyahoukou = (ERessyahoukou)iRessyahoukou ;
				Mu<CentDedRessya*>*	pMuRessya = pDia->getCentDedRessyaCont( eRessyahoukou )->getMuPtr() ;

				//	ダイヤ内の下り/上り内のすべての列車のループ
				for ( int idxRessya = 0 ; idxRessya < pMuRessya->size() ; idxRessya ++ )
				{
					CentDedRessya* pRessya = pMuRessya->get( idxRessya ) ;

					//	列車のすべての駅時刻の向きを反転
					for ( int idxEkiBegin = 0 , idxEkiEnd = m_pCentDedEkiCont->size() - 1 ;
						idxEkiBegin < idxEkiEnd ;
						idxEkiBegin ++ , idxEkiEnd -- )
					{
						CentDedEkiJikoku	aEkiJikokuBegin = pRessya->getCentDedEkiJikoku( idxEkiBegin ) ;
						CentDedEkiJikoku	aEkiJikokuEnd = pRessya->getCentDedEkiJikoku( idxEkiEnd ) ;
						
						pRessya->setCentDedEkiJikoku( idxEkiBegin , aEkiJikokuEnd ) ;
						pRessya->setCentDedEkiJikoku( idxEkiEnd , aEkiJikokuBegin ) ;
					}
				}
			}
		}
	}
*/

}