summaryrefslogtreecommitdiff
path: root/yapf/array.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'yapf/array.hpp')
-rw-r--r--yapf/array.hpp69
1 files changed, 69 insertions, 0 deletions
diff --git a/yapf/array.hpp b/yapf/array.hpp
new file mode 100644
index 000000000..cfee3c3e6
--- /dev/null
+++ b/yapf/array.hpp
@@ -0,0 +1,69 @@
+/* $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 */