File: LinearMultiArray.h

package info (click to toggle)
setcover 0.0~git20161128.b1de791-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 148 kB
  • sloc: cpp: 435; makefile: 51
file content (72 lines) | stat: -rw-r--r-- 2,143 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#ifndef __graphcluster__LinearMultiArray__
#define __graphcluster__LinearMultiArray__
#include <algorithm>
#include <cstdlib>




template<class T> class linear_multi_array
{
public:
    linear_multi_array(unsigned int * element_size_lookup,
                       unsigned int element_size,
                       unsigned int size)
    {
        this->size = std::max((unsigned int)1,size); //at least one
        multi_array = (T*) malloc( sizeof(T)*size);
        next_pos_to_write = (T**) malloc( sizeof(T *)*(element_size+1));
        int last_element=0;
        for(unsigned int i = 0; i <= element_size; i++){
            this->xorSwap(&element_size_lookup[0], &element_size_lookup[i+1]);
            element_size_lookup[i+1] = last_element+element_size_lookup[i+1];
            last_element = element_size_lookup[i+1];
        }
        this->element_offset = element_size_lookup;
        
        
        for(unsigned int i = 0; i <= element_size; i++){
            next_pos_to_write[i] = &multi_array[element_offset[i]];
        }

    }
        
        
    
    ~linear_multi_array() {free(multi_array); free(next_pos_to_write);}

    const std::pair<T*, int> get_array(int i); // get value
    void add_value_at(int i,T element); // push it
    T   *multi_array;                   // the array
    unsigned int size;                  // size of the whole array
    
private:
    unsigned int *element_offset;    // element lookuptable
    T   **next_pos_to_write;
    void xorSwap (unsigned int * x, unsigned int * y);
};

template<class T> void linear_multi_array<T>::xorSwap (unsigned int * x, unsigned int * y) {
    *x ^= *y;
    *y ^= *x;
    *x ^= *y;
}

template<class T> const std::pair<T*, int> linear_multi_array<T>::get_array(int i)
{
    std::pair<T*,int> ret_value;
    int from = element_offset[i];
    int to   = element_offset[i+1];
    int size = to - from;
    ret_value.second = size;
    ret_value.first  = &multi_array[from];
    return ret_value;
}

template<class T> void linear_multi_array<T>::add_value_at(int i,T element)
{
    *(next_pos_to_write[i]) = element;
    next_pos_to_write[i]++;
}

#endif