//
// This header file defines the container class openArrayT<> and
// its associated iterator. This container class represents an open
// array with packed and unpacked dimensions.
//

#ifndef OPEN_ARRAY_H
#define OPEN_ARRAY_H

#include "svdpi.h"
#include "array.h"

namespace DPI_OO {

	template <typename T>
	class openArrayT : public arrayT<T, T> {

	public:
		typedef DPI_OO::openArrayIterT<T, T> iterator;

		openArrayT()
		{}

		openArrayT(const openArrayT<T>& from)
		{}

		~openArrayT()
		{}

		virtual int size() = 0;

		virtual int arraysize() = 0;

		virtual int low() = 0;
		virtual int high() = 0;
		virtual int left()  = 0;
		virtual int right()  = 0;
		virtual int dimensions()  = 0;

		virtual openArrayT<T>& operator= (const openArrayT<T>& other) = 0;

		virtual iterator begin() = 0;
		virtual iterator end() = 0;
	};

	template <typename T>
	class svOpenArrayT : public openArrayT<T> {

	public:
		svOpenArrayT(svOpenArrayHandle hndl);

		svOpenArrayT(const svOpenArrayT<T>& from);

		~svOpenArrayT();

		int size();

		int arraysize();

		int low();
		int high();
		int left();
		int right();
		int dimensions();

		T* operator [] (int idx);

		openArrayT<T>& operator= (const openArrayT<T>& other);

		T* operator* ();

		iterator begin();

		iterator end();

	};
};

#endif
