summaryrefslogtreecommitdiffstats
path: root/akregator/src/mk4storage/metakit/src/column.h
diff options
context:
space:
mode:
Diffstat (limited to 'akregator/src/mk4storage/metakit/src/column.h')
-rw-r--r--akregator/src/mk4storage/metakit/src/column.h212
1 files changed, 212 insertions, 0 deletions
diff --git a/akregator/src/mk4storage/metakit/src/column.h b/akregator/src/mk4storage/metakit/src/column.h
new file mode 100644
index 00000000..3f6e4f15
--- /dev/null
+++ b/akregator/src/mk4storage/metakit/src/column.h
@@ -0,0 +1,212 @@
+// column.h --
+// $Id$
+// This is part of Metakit, see http://www.equi4.com/metakit/
+
+/** @file
+ * Definition of the column classes
+ */
+
+#ifndef __COLUMN_H__
+#define __COLUMN_H__
+
+/////////////////////////////////////////////////////////////////////////////
+// Declarations in this file
+
+ class c4_Column; // a column in a table
+ class c4_ColIter; // an iterator over column data
+ class c4_ColCache; // manages a cache for columns
+
+ class c4_Persist; // not defined here
+ class c4_Strategy; // not defined here
+
+/////////////////////////////////////////////////////////////////////////////
+
+class c4_Column
+{
+ c4_PtrArray _segments;
+ t4_i32 _position;
+ t4_i32 _size;
+ c4_Persist* _persist;
+ t4_i32 _gap;
+ int _slack;
+ bool _dirty;
+
+public:
+ c4_Column (c4_Persist* persist_);
+ //: Constructs a column using the specified persistence manager.
+ ~c4_Column ();
+
+ void SetBuffer(t4_i32);
+ //: Allocate a new buffer of the specified size.
+
+ c4_Persist* Persist() const;
+ //: Returns persistence manager for this column, or zero.
+ c4_Strategy& Strategy() const;
+ //: Returns the associated strategy pointer.
+ t4_i32 Position() const;
+ //: Special access for the DUMP program.
+ t4_i32 ColSize() const;
+ //: Returns the number of bytes as stored on disk.
+ bool IsDirty() const;
+ //: Returns true if contents needs to be saved.
+
+ void SetLocation(t4_i32, t4_i32);
+ //: Sets the position and size of this column on file.
+ void PullLocation(const t4_byte*& ptr_);
+ //: Extract position and size of this column.
+
+ int AvailAt(t4_i32 offset_) const;
+ //: Returns number of bytes we can access at once.
+ const t4_byte* LoadNow(t4_i32);
+ //: Makes sure the data is loaded into memory.
+ t4_byte* CopyNow(t4_i32);
+ //: Makes sure a copy of the data is in memory.
+ void Grow(t4_i32, t4_i32);
+ //: Grows the buffer by inserting space.
+ void Shrink(t4_i32, t4_i32);
+ //: Shrinks the buffer by removing space.
+ void SaveNow(c4_Strategy&, t4_i32 pos_);
+ //: Save the buffer to file.
+
+ const t4_byte* FetchBytes(t4_i32 pos_, int len_, c4_Bytes& buffer_, bool forceCopy_);
+ //: Returns pointer to data, use buffer only if non-contiguous.
+ void StoreBytes(t4_i32 pos_, const c4_Bytes& buffer_);
+ //: Stores a copy of the buffer in the column.
+
+ bool RequiresMap() const;
+ void ReleaseAllSegments();
+
+ static t4_i32 PullValue(const t4_byte*& ptr_);
+ static void PushValue(t4_byte*& ptr_, t4_i32 v_);
+
+ void InsertData(t4_i32 index_, t4_i32 count_, bool clear_);
+ void RemoveData(t4_i32 index_, t4_i32 count_);
+ void RemoveGap();
+
+ enum { kSegBits = 12, kSegMax = 1 << kSegBits, kSegMask = kSegMax - 1 };
+
+private:
+ static int fSegIndex(t4_i32 offset_);
+ static t4_i32 fSegOffset(int index_);
+ static int fSegRest(t4_i32 offset_);
+
+ bool UsesMap(const t4_byte*) const;
+ bool IsMapped() const;
+
+ void ReleaseSegment(int);
+ void SetupSegments();
+ void Validate() const;
+ void FinishSlack();
+
+ void MoveGapUp(t4_i32 pos_);
+ void MoveGapDown(t4_i32 pos_);
+ void MoveGapTo(t4_i32 pos_);
+
+ t4_byte* CopyData(t4_i32, t4_i32, int);
+};
+
+/////////////////////////////////////////////////////////////////////////////
+
+class c4_ColOfInts : public c4_Column
+{
+public:
+ c4_ColOfInts (c4_Persist* persist_, int width_ =sizeof (t4_i32));
+
+ int RowCount() const;
+ void SetRowCount(int numRows_);
+
+ void FlipBytes();
+
+ int ItemSize(int index_);
+ const void* Get(int index_, int& length_);
+ void Set(int index_, const c4_Bytes& buf_);
+
+ t4_i32 GetInt(int index_);
+ void SetInt(int index_, t4_i32 value_);
+
+ void Insert(int index_, const c4_Bytes& buf_, int count_);
+ void Remove(int index_, int count_);
+
+ static int CalcAccessWidth(int numRows_, t4_i32 colSize_);
+
+ void SetAccessWidth(int bits_);
+ void FixSize(bool fudge_);
+ void ForceFlip();
+
+ static int DoCompare(const c4_Bytes& b1_, const c4_Bytes& b2_);
+
+private:
+ typedef void (c4_ColOfInts::*tGetter) (int);
+ typedef bool (c4_ColOfInts::*tSetter) (int, const t4_byte*);
+
+ void Get_0b(int index_);
+ void Get_1b(int index_);
+ void Get_2b(int index_);
+ void Get_4b(int index_);
+ void Get_8i(int index_);
+ void Get_16i(int index_);
+ void Get_16r(int index_);
+ void Get_32i(int index_);
+ void Get_32r(int index_);
+ void Get_64i(int index_);
+ void Get_64r(int index_);
+
+ bool Set_0b(int index_, const t4_byte* item_);
+ bool Set_1b(int index_, const t4_byte* item_);
+ bool Set_2b(int index_, const t4_byte* item_);
+ bool Set_4b(int index_, const t4_byte* item_);
+ bool Set_8i(int index_, const t4_byte* item_);
+ bool Set_16i(int index_, const t4_byte* item_);
+ bool Set_16r(int index_, const t4_byte* item_);
+ bool Set_32i(int index_, const t4_byte* item_);
+ bool Set_32r(int index_, const t4_byte* item_);
+ bool Set_64i(int index_, const t4_byte* item_);
+ bool Set_64r(int index_, const t4_byte* item_);
+
+ void ResizeData(int index_, int count_, bool clear_ =false);
+
+ tGetter _getter;
+ tSetter _setter;
+
+ union {
+ t4_byte _item[8]; // holds temp result (careful with alignment!)
+ double _aligner; // needed for SPARC
+ };
+
+ int _currWidth; // number of bits used for one entry (0..64)
+ int _dataWidth; // number of bytes used for passing a value along
+ int _numRows;
+ bool _mustFlip;
+};
+
+/////////////////////////////////////////////////////////////////////////////
+
+class c4_ColIter
+{
+ c4_Column& _column;
+ t4_i32 _limit;
+ t4_i32 _pos;
+ int _len;
+ const t4_byte* _ptr;
+
+public:
+ c4_ColIter (c4_Column& col_, t4_i32 offset_, t4_i32 limit_);
+// ~c4_ColIter ();
+
+ bool Next();
+ bool Next(int max_);
+
+ const t4_byte* BufLoad() const;
+ t4_byte* BufSave();
+ int BufLen() const;
+};
+
+/////////////////////////////////////////////////////////////////////////////
+
+#if q4_INLINE
+#include "column.inl"
+#endif
+
+/////////////////////////////////////////////////////////////////////////////
+
+#endif