ConnectionRelation.cpp

#include "StdAfx.h"
#include "ConnectionRelation.h"


#include "Link.h"


using namespace Core;
using namespace System;
using namespace System::Diagnostics;


/// [ Constructor ]
ConnectionRelation::ConnectionRelation( Link^ upper, Link^ equal, Link^ lower ) :
    m_upper( upper ),
    m_equal( equal ),
    m_lower( lower )
{
    // データを確認する
    CheckData();
}

/// [ Constructor ]
ConnectionRelation::ConnectionRelation( Link^ upper, Links^ links, System::Xml::XmlElement^ element ) :
    m_upper( upper )
{
    Xml::XmlElement^ node = element[ "connection" ];

    if( node != nullptr )
    {
        // 取得できたならば、属性から設定する
        m_equal = GetLink( links, node->GetAttribute( "equal" ) );
        m_lower = GetLink( links, node->GetAttribute( "lower" ) );
    }

    // データを確認する
    CheckData();
}


/// リンクを取得する
Link^ ConnectionRelation::GetLink( Links^ links, System::String^ linkName )
{
    if( linkName != String::Empty )
    {
        for each( Link^ link in links )
        {
            Debug::Assert( link != nullptr, "リンクは生成されている" );

            if( link->Name == linkName )
            {
                // リンクの名称が一致したならば、そのリンクを返す
                return link;
            }
        }
        Debug::Fail( "指定されたリンクが存在しない" );
    }
    return nullptr;
}

/// データを確認する
void ConnectionRelation::CheckData()
{
    Debug::Assert(
        ( m_upper != nullptr ) ||
        ( m_equal != nullptr ) ||
        ( m_lower != nullptr ),
        "どこかに接続している"
    );

    if( m_upper != nullptr )
    {
        Debug::Assert( m_upper != m_equal, "同じところには接続されない" );
    }

    if( m_equal != nullptr )
    {
        Debug::Assert( m_equal != m_lower, "同じところには接続されない" );
    }

    if( m_lower != nullptr )
    {
        Debug::Assert( m_lower != m_upper, "同じところには接続されない" );
    }

    Debug::Assert(
        !( ( m_upper == nullptr ) && ( m_equal != nullptr ) ),
        "接続元がない(最上位に位置する)ものは、対等な関係を持たない"
    );
}

/// データを確認する
void ConnectionRelation::CheckData( Link^ ownLink )
{
    Debug::Assert(
        ( ownLink != m_upper ) &&
        ( ownLink != m_equal ) &&
        ( ownLink != m_lower ),
        "自分自身には接続されない"
    );
}


/// インスタンスの説明を文字列で返す
String^ ConnectionRelation::ToString()
{
    return String::Format(
        "上方:{0} 対等:{1} 下方:{2}",
        ( Upper != nullptr )? Upper->Name : "---",
        ( Equal != nullptr )? Equal->Name : "---",
        ( Lower != nullptr )? Lower->Name : "---"
    );
}