size.cpp

#include "size.h"


using namespace Robotics;
using namespace System;
using namespace System::Diagnostics;


/// [ Constructor ]
Size::Size( double x, double y, double z )
{
    this->X = x;
    this->Y = y;
    this->Z = z;

    /// @note 設定値の確認を行うために プロパティを用いている
}

/// XMLから生成する [ Constructor ]
Size::Size( System::Xml::XmlElement^ element )
{
    // 要素を取得する
    Xml::XmlElement^ node = element[ "size" ];

    Debug::Assert( node != nullptr, "要素を有している" );


    // ... 属性から設定する
    this->X = Double::Parse( node->GetAttribute( "x" ) );
    this->Y = Double::Parse( node->GetAttribute( "y" ) );
    this->Z = Double::Parse( node->GetAttribute( "z" ) );

    /// @note 設定値の確認を行うために プロパティを用いている
}


/// 積 *= [ Operator Overloading ]
Size Size::operator*=( double val )
{
    m_x *= val;
    m_y *= val;
    m_z *= val;

    return *this;
}

/// 商 /= [ Operator Overloading ]
Size Size::operator/=( double val )
{
    Debug::Assert( Double::Epsilon <= Math::Abs( val ), "引数はゼロではない (ゼロ除算の防止)" );

    m_x /= val;
    m_y /= val;
    m_z /= val;

    return *this;
}


/// 積 * [ Operator Overloading ]
Size Size::operator*( Size% obj, double val )
{
    Size result( obj );
    result *= val;

    return result;
}

/// 商 / [ Operator Overloading ]
Size Size::operator/( Size% obj, double val )
{
    Size result( obj );
    result /= val;

    return result;
}


/// 等価演算子 == [ Operator Overloading ]
bool Size::operator==( Size% left, Size% right )
{
    // 値の等価を確認する
    return left.Equals( right );
}

/// 不等価演算子 != [ Operator Overloading ]
bool Size::operator!=( Size% left, Size% right )
{
    // 値の等価の否定を返す
    return !left.Equals( right );
}

/// 値の等価を確認する
bool Size::Equals( Size% obj )
{
    return ( m_x == obj.m_x ) && ( m_y == obj.m_y ) && ( m_z == obj.m_z );
}


/// サイズはゼロか?
bool Size::IsZero()
{
    return ( m_x == 0.0 ) && ( m_y == 0.0 ) && ( m_z == 0.0 );

    /// @note
    /// ゼロで初期化されているかどうかを判定するためであるから、
    /// 計算機イプシロンとは比較していない。
}


/// インスタンスの説明を文字列で返す
System::String^ Size::ToString()
{
    return String::Format( "{0:0.000} {1:0.000} {2:0.000}", m_x, m_y, m_z );
}