Branch data Line data Source code
1 : :
2 : : #include <algorithm>
3 : : #include "VGArray.hpp"
4 : : #include "CubitDefines.h"
5 : :
6 : : template <class T>
7 : 0 : VGArray<T>::VGArray( int init_size )
8 : : {
9 [ # # ]: 0 : if( init_size <= 0 )
10 : : {
11 : 0 : storage_ = 0;
12 : 0 : size_ = 0;
13 : 0 : data_ = 0;
14 : : }
15 : : else
16 : : {
17 : 0 : size_ = init_size;
18 : 0 : storage_ = storage( init_size );
19 [ # # ][ # # ]: 0 : data_ = new T[storage_];
[ # # ][ # # ]
20 : : }
21 [ # # ]: 0 : }
22 : :
23 : : template <class T>
24 : 0 : VGArray<T>::~VGArray( )
25 : : {
26 [ # # ][ # # ]: 0 : delete [] data_;
27 : 0 : storage_ = size_ = 0;
28 : 0 : data_ = 0;
29 : 0 : }
30 : :
31 : : template <class T>
32 : 0 : void VGArray<T>::size( int new_size )
33 : : {
34 [ # # ]: 0 : if( new_size <= 0 )
35 : : {
36 : 0 : new_size = 0;
37 : : }
38 [ # # ]: 0 : else if( new_size > storage_ )
39 : : {
40 : 0 : int new_stor = storage(new_size);
41 [ # # ]: 0 : assert( new_stor > storage_ );
42 [ # # ][ # # ]: 0 : T* new_array = new T[new_stor];
[ # # # # ]
43 [ # # ][ # # ]: 0 : if( data_ )
44 : : {
45 : 0 : memcpy( new_array, data_, size_ * sizeof(T) );
46 [ # # ][ # # ]: 0 : delete [] data_;
47 : : }
48 : 0 : data_ = new_array;
49 : 0 : storage_ = new_stor;
50 : : }
51 : 0 : size_ = new_size;
52 [ # # ]: 0 : }
53 : :
54 : : template <class T>
55 : 0 : void VGArray<T>::size_end( int new_size )
56 : : {
57 [ # # ]: 0 : if( new_size <= 0 )
58 : : {
59 : 0 : new_size = 0;
60 : : }
61 [ # # ]: 0 : else if( new_size > storage_ )
62 : : {
63 : 0 : int new_stor = storage(new_size);
64 [ # # ]: 0 : assert( new_stor > storage_ );
65 [ # # ][ # # ]: 0 : T* new_array = new T[new_stor];
[ # # # # ]
66 [ # # ][ # # ]: 0 : if( data_ )
67 : : {
68 : 0 : memcpy( new_array + new_size - size_, data_, size_ * sizeof(T) );
69 [ # # ][ # # ]: 0 : delete [] data_;
70 : : }
71 : 0 : data_ = new_array;
72 : 0 : storage_ = new_stor;
73 : : }
74 [ # # ]: 0 : else if (new_size > size_)
75 : : {
76 : 0 : T* read = data_ + size_;
77 : 0 : T* write = data_ + new_size;
78 [ # # ]: 0 : while ( read > data_ )
79 : 0 : *(--write) = *(--read);
80 : : }
81 [ # # ]: 0 : else if (new_size < size_)
82 : : {
83 : 0 : T* read = data_ + size_ - new_size;
84 : 0 : T* write = data_;
85 : 0 : T* end = data_ + size_;
86 [ # # ]: 0 : while ( read < end )
87 : 0 : *(write--) = *(read--);
88 : : }
89 : 0 : size_ = new_size;
90 [ # # ]: 0 : }
91 : :
92 : : template <class T>
93 : 0 : int VGArray<T>::storage( int size )
94 : : {
95 [ # # ]: 0 : assert( size <= 0x40000000 ); //no power of 2 greater than size (overflow)
96 : :
97 : : int result;
98 [ # # ]: 0 : for( result = 1; result < size; result = result << 1 );
99 [ # # ]: 0 : assert(result>=size);
100 : 0 : return result;
101 : : }
102 : :
103 : : template <class T>
104 : 0 : void VGArray<T>::remove( int index )
105 : : {
106 [ # # ][ # # ]: 0 : assert( index >= 0 && index < size_ );
107 : 0 : size_--;
108 : 0 : T* ptr = data_ + index;
109 : 0 : T* end = data_ + size_;
110 [ # # ]: 0 : while( ptr < end )
111 : : {
112 : 0 : T* next = ptr + 1;
113 : 0 : *ptr = *next;
114 : 0 : ptr = next;
115 : : }
116 : 0 : }
117 : :
118 : : template <class T>
119 : 0 : void VGArray<T>::insert( const T& entry, int index )
120 : : {
121 [ # # ][ # # ]: 0 : assert( index >= 0 && index <= size_ );
122 : :
123 : 0 : size( size_ + 1 );
124 : 0 : T* ptr = data_ + size_ - 1;
125 : 0 : T* end = data_ + index;
126 : :
127 [ # # ]: 0 : while( ptr > end )
128 : : {
129 : 0 : T* next = ptr - 1;
130 : 0 : *ptr = *next;
131 : 0 : ptr = next;
132 : : }
133 : :
134 : 0 : data_[index] = entry;
135 : 0 : }
136 : :
137 : : template <class T>
138 : 0 : int VGArray<T>::find( const T& entry, int search_from ) const
139 : : {
140 [ # # ]: 0 : assert( search_from >= 0 );
141 : :
142 [ # # ]: 0 : if( data_ )
143 : : {
144 : 0 : T* ptr = data_ + search_from;
145 : 0 : T* end = data_ + size_;
146 [ # # ]: 0 : for(; ptr < end; ptr++ )
147 : : {
148 [ # # ]: 0 : if( *ptr == entry )
149 : 0 : return ptr - data_;
150 : : }
151 : : }
152 : 0 : return -1;
153 : : }
154 : :
155 : : template <class T>
156 : 0 : void VGArray<T>::reverse()
157 : : {
158 : 0 : T* start = data_;
159 : 0 : T* end = data_ + size_ - 1;
160 [ # # ]: 0 : while (start < end)
161 : : {
162 : 0 : std::swap(*start,*end);
163 : 0 : start++;
164 : 0 : end--;
165 : : }
166 : 0 : }
167 : :
|