More small changes
[charm.git] / src / langs / charj / src / charj / libs / Array.h
1 #ifndef ARRAY_H
2 #define ARRAY_H
3
4 namespace CharjArray {
5   class Range {
6   public:
7     int size, offset;
8     Range() {}
9     Range(int size_) : size(size_) {}
10   };
11
12   template<int dims>
13   class Domain {
14   public:
15     Range ranges[dims];
16     
17     Domain() {}
18
19     Domain(Range ranges_[]) {
20       for (int i = 0; i < dims; i++) 
21         ranges[i] = ranges_[i];      
22     }
23
24     Domain(Range range) {
25       ranges[0] = range;
26     }
27
28     int size() {
29       int total = 0;
30       for (int i = 0; i < dims; i++)
31         if (total == 0)
32           total = ranges[i].size;
33         else
34           total *= ranges[i].size;
35     }
36   };
37
38   template<int dims>
39   class Point : public Domain<dims> {
40   public:
41     Point(int dim) : Domain<dims>() {
42       this->ranges[0].size = dim;
43     }
44   };
45
46   enum ArrayType { RECT, JAGGED, ROW_MAJOR, COL_MAJOR };
47  
48   template<class type, int dims = 1, int atype = RECT>
49   class Array {
50   private:
51     Domain<dims> domain;
52     type *block;
53     bool initialized;
54
55   public:
56     Array() : initialized(false) {}
57
58     void init(Domain<dims> domain_) {
59       domain = domain_;
60       if (atype == RECT)
61         block = new type[domain.size()];
62       initialized = true;
63     }
64
65     ~Array() {
66       delete block;
67     }
68     
69     type& operator[] (const Point<dims> &point) {
70       return block[point.ranges[0].size];
71       //return block[index];
72     }
73     
74     /*Array<type, dims, atype>& operator[] (const Domain<dims> &domain) {
75       
76       }*/
77
78     int size() {
79       return domain.size();
80     }
81
82   };
83 }
84
85 #endif