yapf/array.hpp
author peter1138
Sun, 01 Oct 2006 12:00:32 +0000
changeset 4694 c917a3ad0dd2
parent 4549 106ed18a7675
child 5081 fe3a6da19d9f
permissions -rw-r--r--
(svn r6601) - Codechange: Support cargo subtypes in the refit window. The refit window has been altered to support resizing and scrolling. Note that the cargo subtype isn't yet passed for actual refitting yet. (Based on mart3p's patch)
/* $Id$ */

#ifndef  ARRAY_HPP
#define  ARRAY_HPP

#include "fixedsizearray.hpp"

/** Flexible array with size limit. Implemented as fixed size
 *  array of fixed size arrays */
template <class Titem_, int Tblock_size_ = 1024, int Tnum_blocks_ = Tblock_size_>
class CArrayT {
public:
	typedef Titem_ Titem; ///< Titem is now visible from outside
	typedef CFixedSizeArrayT<Titem_, Tblock_size_> CSubArray; ///< inner array
	typedef CFixedSizeArrayT<CSubArray, Tnum_blocks_> CSuperArray; ///< outer array

protected:
	CSuperArray     m_a; ///< array of arrays of items

public:
	ST_CONST(int, Tblock_size = Tblock_size_); ///< block size is now visible from outside
	ST_CONST(int, Tnum_blocks = Tnum_blocks_); ///< number of blocks is now visible from outside
	ST_CONST(int, Tcapacity = Tblock_size * Tnum_blocks); ///< total max number of items

	/** implicit constructor */
	FORCEINLINE CArrayT() { }
	/** Return actual number of items */
	FORCEINLINE int Size() const
	{
		int super_size = m_a.Size();
		if (super_size == 0) return 0;
		int sub_size = m_a[super_size - 1].Size();
		return (super_size - 1) * Tblock_size + sub_size;
	}
	/** return true if array is empty */
	FORCEINLINE bool IsEmpty() { return m_a.IsEmpty(); }
	/** return true if array is full */
	FORCEINLINE bool IsFull() { return m_a.IsFull() && m_a[Tnum_blocks - 1].IsFull(); }
	/** return first sub-array with free space for new item */
	FORCEINLINE CSubArray& FirstFreeSubArray()
	{
		int super_size = m_a.Size();
		if (super_size > 0) {
			CSubArray& sa = m_a[super_size - 1];
			if (!sa.IsFull()) return sa;
		}
		return m_a.Add();
	}
	/** allocate but not construct new item */
	FORCEINLINE Titem_& AddNC() { return FirstFreeSubArray().AddNC(); }
	/** allocate and construct new item */
	FORCEINLINE Titem_& Add()   { return FirstFreeSubArray().Add(); }
	/** indexed access (non-const) */
	FORCEINLINE Titem& operator [] (int idx)
	{
		CSubArray& sa = m_a[idx / Tblock_size];
		Titem& item   = sa [idx % Tblock_size];
		return item;
	}
	/** indexed access (const) */
	FORCEINLINE const Titem& operator [] (int idx) const
	{
		CSubArray& sa = m_a[idx / Tblock_size];
		Titem& item   = sa [idx % Tblock_size];
		return item;
	}
};

#endif /* ARRAY_HPP */