/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2016 Raytrix GmbH. All rights reserved.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#pragma once

#include "DllInterface.h"
#include "Rx.Interop.Runtime30/IMemory2D.h"

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// namespace: Rx
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
namespace Rx
{
	// Forward declaration to private class
	template<class T> class CRxArray2DBase;

	/**
	\addtogroup RxCore_Tools
	**/
	/// @{

	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	/// <summary>
	/// 	A 2D double array.
	/// </summary>
	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	class RXCOREEX_API CRxArray2DDouble : public Interop::Runtime30::IMemory2D
	{
	public:

		/// <summary> Defines an alias representing the type of the elements in this array. </summary>
		typedef double TValue;

	public:

		CRxArray2DDouble();
		CRxArray2DDouble(size_t nRows, size_t nCols);

		CRxArray2DDouble(const CRxArray2DDouble& xMatrix);
		virtual ~CRxArray2DDouble();

	public:

		CRxArray2DDouble& operator=(const CRxArray2DDouble& xMatrix);
		TValue& operator()(size_t nRow, size_t nCol);
		const TValue& operator()(size_t nRow, size_t nCol) const;

	public:

		TValue* GetDataPtr();
		const TValue* GetDataPtr() const;

	public:

		virtual void New(size_t nRows, size_t nCols);
		virtual void Resize(size_t nRows, size_t nCols);

		virtual void Delete();
		virtual void Reset();

		virtual void CopyFrom(const IMemory2DAccess* pMemory);
		virtual size_t GetElementSize() const;
		virtual void GetSize(size_t& nRows, size_t& nCols) const;

		virtual void* GetPointer()
		{
			return (void*) GetDataPtr();
		}

		virtual const void* GetPointer() const
		{
			return (const void*) GetDataPtr();
		}

		virtual bool IsValid() const;

	protected:

		CRxArray2DBase<TValue>* m_pxData;
	};

	/// @}
}

#pragma make_public(Rx::CRxArray2DDouble)
