Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/kornelski/7z.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to '7zip/Compress/Rar29/Original/array.hpp')
-rwxr-xr-x7zip/Compress/Rar29/Original/array.hpp121
1 files changed, 121 insertions, 0 deletions
diff --git a/7zip/Compress/Rar29/Original/array.hpp b/7zip/Compress/Rar29/Original/array.hpp
new file mode 100755
index 00000000..3afec70c
--- /dev/null
+++ b/7zip/Compress/Rar29/Original/array.hpp
@@ -0,0 +1,121 @@
+#ifndef _RAR_ARRAY_
+#define _RAR_ARRAY_
+
+extern ErrorHandler ErrHandler;
+
+template <class T> class Array
+{
+ private:
+ T *Buffer;
+ int BufSize;
+ int AllocSize;
+ public:
+ Array();
+ Array(int Size);
+ ~Array();
+ inline void CleanData();
+ inline T& operator [](int Item);
+ inline int Size();
+ void Add(int Items);
+ void Alloc(int Items);
+ void Reset();
+ void operator = (Array<T> &Src);
+ void Push(T Item);
+};
+
+template <class T> void Array<T>::CleanData()
+{
+ Buffer=NULL;
+ BufSize=0;
+ AllocSize=0;
+}
+
+
+template <class T> Array<T>::Array()
+{
+ CleanData();
+}
+
+
+template <class T> Array<T>::Array(int Size)
+{
+ Buffer=(T *)rarmalloc(sizeof(T)*Size);
+ if (Buffer==NULL && Size!=0)
+ ErrHandler.MemoryError();
+
+ AllocSize=BufSize=Size;
+}
+
+
+template <class T> Array<T>::~Array()
+{
+ if (Buffer!=NULL)
+ rarfree(Buffer);
+}
+
+
+template <class T> inline T& Array<T>::operator [](int Item)
+{
+ return(Buffer[Item]);
+}
+
+
+template <class T> inline int Array<T>::Size()
+{
+ return(BufSize);
+}
+
+
+template <class T> void Array<T>::Add(int Items)
+{
+ BufSize+=Items;
+ if (BufSize>AllocSize)
+ {
+ int Suggested=AllocSize+AllocSize/4+32;
+ int NewSize=Max(BufSize,Suggested);
+
+ Buffer=(T *)rarrealloc(Buffer,NewSize*sizeof(T));
+ if (Buffer==NULL)
+ ErrHandler.MemoryError();
+ AllocSize=NewSize;
+ }
+}
+
+
+template <class T> void Array<T>::Alloc(int Items)
+{
+ if (Items>AllocSize)
+ Add(Items-BufSize);
+ else
+ BufSize=Items;
+}
+
+
+template <class T> void Array<T>::Reset()
+{
+ if (Buffer!=NULL)
+ {
+ rarfree(Buffer);
+ Buffer=NULL;
+ }
+ BufSize=0;
+ AllocSize=0;
+}
+
+
+template <class T> void Array<T>::operator =(Array<T> &Src)
+{
+ Reset();
+ Alloc(Src.BufSize);
+ if (Src.BufSize!=0)
+ memcpy((void *)Buffer,(void *)Src.Buffer,Src.BufSize*sizeof(T));
+}
+
+
+template <class T> void Array<T>::Push(T Item)
+{
+ Add(1);
+ (*this)[Size()-1]=Item;
+}
+
+#endif