/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2013 Raytrix GmbH. All rights reserved.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#pragma once

#include <cstdint>

#ifndef RX_STATIC
    #ifdef RXINTEROP30_EXPORTS
		#define RXINTEROP30_API __declspec(dllexport)
    #else
		#define RXINTEROP30_API __declspec(dllimport)
    #endif
#else
	#define RXINTEROP30_API
#endif
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// namespace: Rx.Interop.Runtime30
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
namespace Rx
{
	namespace Interop
	{
		namespace Runtime30
		{
			/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
			/// <summary>
			/// 	Unique identifier.
			/// </summary>
			/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
			class RXINTEROP30_API CGuid
			{
			public:

				/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
				/// <summary>
				/// 	Default constructor.
				/// </summary>
				/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
				CGuid();

				/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
				/// <summary>
				/// 	Constructor.
				/// </summary>
				///
				/// <param name="pcGUID">	"{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" or "{XXXXXXXX - XXXX - XXXX - XXXX - XXXXXXXXXXXX}". </param>
				/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
				CGuid(const char* pcGUID);

				/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
				/// <summary>	Assignment operator. Throws an std::exception if the string parsing failed. </summary>
				///
				/// <param name="pcGUID">	"{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" or "{XXXXXXXX - XXXX - XXXX - XXXX - XXXXXXXXXXXX}". </param>
				///
				/// <returns>	A new GUID. </returns>
				/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
				CGuid& operator=(const char* pcGUID);

				/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
				/// <summary>	Equality operator. </summary>
				///
				/// <param name="xRef">	The reference GUID. </param>
				///
				/// <returns>	True if the parameters are considered equivalent. </returns>
				/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
				bool operator==(const CGuid& xRef) const;

				/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
				/// <summary>	Inequality operator. </summary>
				///
				/// <param name="xRef">	The reference GUID. </param>
				///
				/// <returns>	True if the parameters are not considered equivalent. </returns>
				/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
				bool operator!=(const CGuid& xRef) const;

				/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
				/// <summary>
				/// 	Convert this CGuid into a string representation.
				/// </summary>
				///
				/// <param name="pcBuff">	String buffer. Must be of size 40. </param>
				/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
				void ToString(char pcBuff[40]) const;

			public:

				uint32_t m_u32Data1;
				uint16_t m_u16Data2;
				uint16_t m_u16Data3;
				uint8_t m_pu8Data4[8];
			};
		}
	}

	/// <summary> Defines an alias representing the GUID interface of RxRuntime 3.0. </summary>
	typedef Interop::Runtime30::CGuid CGuid30;
}
