source: trunk/lib/symtab/arrays/StackArray2D.h @ 1229

Last change on this file since 1229 was 1229, checked in by vla24, 8 years ago

Reorganized SymbolTable? library

File size: 3.2 KB
Line 
1/*
2 * StackArray2D.h
3 *
4 *  Created on: 22-Oct-2009
5 *  Author: ksherdy
6 *  Description: A stack allocated, static, 2D array. This class represents a block of memory allocated on the stack with 2D indexing methods.
7 */
8
9// WARNING --- TEST BEFORE USE
10
11#ifndef STACKARRAY2D_
12#define STACKARRAY2D_
13
14#include <memory.h>
15
16#define BOUNDS_CHECK
17
18#ifdef BOUNDS_CHECK
19        #include <cstdlib>
20        #include <iostream>
21        using namespace std;
22#endif
23
24#define STACK_ARRAY_2D(type, rows, cols) new(static_cast<type*>(alloca(sizeof(type) * (rows*cols)))) type[(rows*cols)], \
25                                                                                        rows, \
26                                                                                        cols, \
27                                                                                        new(static_cast<size_t*>(alloca(sizeof(size_t) * (rows)))) size_t[(rows)]
28
29template <typename T>
30class StackArray2D {
31
32public:
33        StackArray2D(T* ary, size_t rows, size_t cols, size_t * cols_size);
34
35        // WARNING: No bounds checking performed unless BOUNDS_CHECK is defined.
36        void Push_back(const size_t row_idx, T value); 
37        // WARNING: No bounds checking performed unless BOUNDS_CHECK is defined.
38        inline void Set(const size_t row_idx, const size_t col_idx, T value);
39        // WARNING: No bounds checking performed unless BOUNDS_CHECK is defined.
40        inline T & Get(const size_t row_idx, const size_t col_idx) const;
41        // Returns current number of row entries by row index.
42        inline size_t RowSize(const size_t row_idx) const { return crt_row_size_[row_idx]; } 
43        // Returns total number of columns allocated.
44        inline size_t ColSize() const { return max_cols_size_; }
45
46private:
47        T * ary_;
48        size_t max_rows_size_;
49        size_t max_cols_size_; 
50        size_t * crt_row_size_;
51};
52
53template <typename T>
54StackArray2D<T>::StackArray2D(T* ary, size_t rows, size_t cols, size_t * cols_size):ary_(ary), max_rows_size_(rows), max_cols_size_(cols), crt_row_size_(cols_size) {
55        memset((size_t *)crt_row_size_, 0, sizeof(size_t));
56}
57
58template <typename T>
59void StackArray2D<T>::Push_back(const size_t row_idx, T value) {
60
61#ifdef BOUNDS_CHECK
62
63        if(row_idx >= max_rows_size_) {
64                cerr << "StackArray2D<T>::Push_back. " << "Row index out of range." << endl;
65                exit(1);
66        }
67       
68        if(crt_row_size_[row_idx] >= max_cols_size_) {
69                cerr << "StackArray2D<T>::Push_back. " << "Row '" << row_idx << "' out of memory." << endl;
70                exit(1);               
71        }
72       
73#endif 
74               
75        *(ary_ + (row_idx * max_cols_size_ + (crt_row_size_[row_idx]))) = value;
76        (crt_row_size_[row_idx])++;     
77}
78
79template <typename T> 
80inline void StackArray2D<T>::Set(const size_t row_idx, const size_t col_idx, T value) {
81#ifdef BOUNDS_CHECK
82        if(row_idx >= max_rows_size_) {
83                cerr << "StackArray2D<T>::Set. " << "Row index out of range." << endl;
84                exit(1);
85        }
86
87        if(col_idx >= max_cols_size_) {
88                cerr << "StackArray2D<T>::Set. " << "Column index out of range." << endl;
89                exit(1);               
90        }
91#endif 
92        *(ary_ + (row_idx * max_cols_size_ + (col_idx))) = value;
93}
94
95template <typename T> 
96inline T & StackArray2D<T>::Get(const size_t row_idx, const size_t col_idx) const {
97
98#ifdef BOUNDS_CHECK
99        if(row_idx >= max_rows_size_) { 
100                cerr << "StackArray2D<T>::Get. " << "Row index out of range." << endl;
101                exit(1);
102        }
103
104        if(col_idx >= max_cols_size_) {
105                cerr << "StackArray2D<T>::Get. " << "Column index out of range." << endl;
106                exit(1);               
107        }
108#endif 
109
110        return *(ary_ + (row_idx * max_cols_size_ + (col_idx)));       
111}
112
113#endif /*STACKARRAY2D_*/
Note: See TracBrowser for help on using the repository browser.