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 ) ; }
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 ) ; } } } } } */ }