2 #ifndef OPENGM_FAST_SEQUENCE_HXX
3 #define OPENGM_FAST_SEQUENCE_HXX
20 template<
class T,
size_t MAX_STACK=opengm::USUAL_MAX_FACTOR_ORDER>
36 template<
class ITERATOR>
void assign(ITERATOR , ITERATOR);
39 T
const *
begin()
const;
40 T
const *
end()
const;
46 void resize(
const size_t );
50 const T&
front()
const;
51 const T&
back()
const;
58 T stackSequence_[MAX_STACK];
59 T* pointerToSequence_;
63 template<
class T,
size_t MAX_STACK>
67 pointerToSequence_(stackSequence_) {
73 template<
class T,
size_t MAX_STACK>
79 capacity_(size>MAX_STACK?size:MAX_STACK) {
83 pointerToSequence_ =
new T[size];
86 pointerToSequence_=stackSequence_;
93 template<
class T,
size_t MAX_STACK>
100 capacity_(size>MAX_STACK?size:MAX_STACK) {
103 if(size_>MAX_STACK) {
104 pointerToSequence_ =
new T[size_];
107 pointerToSequence_=stackSequence_;
109 std::fill(pointerToSequence_, pointerToSequence_+size_, value);
114 template<
class T,
size_t MAX_STACK>
119 : size_(other.size_),
120 capacity_(other.capacity_)
124 if(size_>MAX_STACK) {
125 pointerToSequence_ =
new T[size_];
128 pointerToSequence_=stackSequence_;
130 std::copy(other.pointerToSequence_, other.pointerToSequence_+size_, pointerToSequence_);
134 template<
class T,
size_t MAX_STACK>
136 if(size_>MAX_STACK) {
138 delete[] pointerToSequence_;
144 template<
class T,
size_t MAX_STACK>
155 if(other.size_>MAX_STACK) {
157 if(size_>MAX_STACK) {
158 delete [] pointerToSequence_;
159 pointerToSequence_ =
new T[other.size_];
163 pointerToSequence_ =
new T[other.size_];
169 pointerToSequence_=stackSequence_;
172 std::copy(other.pointerToSequence_, other.pointerToSequence_+size_, pointerToSequence_);
178 template<
class T,
size_t MAX_STACK>
186 template<
class T,
size_t MAX_STACK>
190 return pointerToSequence_;
194 template<
class T,
size_t MAX_STACK>
198 return pointerToSequence_ + size_;
202 template<
class T,
size_t MAX_STACK>
206 return pointerToSequence_;
210 template<
class T,
size_t MAX_STACK>
214 return pointerToSequence_ + size_;
218 template<
class T,
size_t MAX_STACK>
220 FastSequence<T, MAX_STACK>::operator[]
226 return pointerToSequence_[index];
230 template<
class T,
size_t MAX_STACK>
232 FastSequence<T, MAX_STACK>::operator[]
237 return pointerToSequence_[index];
242 template<
class T,
size_t MAX_STACK>
250 if(capacity_ == size_) {
251 T * tmp=
new T[capacity_ * 2];
252 std::copy(pointerToSequence_, pointerToSequence_ + size_, tmp);
253 if(capacity_ > MAX_STACK) {
254 delete[] pointerToSequence_;
257 pointerToSequence_ = tmp;
259 pointerToSequence_[size_]=value;
267 template<
class T,
size_t MAX_STACK>
277 std::copy(pointerToSequence_, pointerToSequence_+size_, tmp);
278 if(capacity_>MAX_STACK) {
279 delete[] pointerToSequence_;
282 pointerToSequence_=tmp;
291 template<
class T,
size_t MAX_STACK>
301 std::copy(pointerToSequence_, pointerToSequence_+size_, tmp);
302 if(capacity_>MAX_STACK) {
303 delete[] pointerToSequence_;
306 pointerToSequence_=tmp;
314 template<
class T,
size_t MAX_STACK>
319 if(capacity_>MAX_STACK) {
320 delete[] pointerToSequence_;
322 pointerToSequence_=stackSequence_;
330 template<
class T,
size_t MAX_STACK>
339 template<
class T,
size_t MAX_STACK>
340 template<
class ITERATOR>
343 this->resize(std::distance(begin, end));
344 std::copy(begin, end, pointerToSequence_);
348 template<
class T,
size_t MAX_STACK>
351 return pointerToSequence_[size_-1];
355 template<
class T,
size_t MAX_STACK>
358 return pointerToSequence_[size_-1];
362 template<
class T,
size_t MAX_STACK>
365 return pointerToSequence_[0];
369 template<
class T,
size_t MAX_STACK>
372 return pointerToSequence_[0];
377 #endif // OPENGM_FAST_SEQUENCE_HXX
FastSequence()
constructor
void assign(ITERATOR, ITERATOR)
assign values
~FastSequence()
destructor
const T & front() const
reference to the first entry
T const & operator[](const size_t) const
access entries
void push_back(const T &)
append a value
Vector that stores values on the stack if size is smaller than MAX_STACK.
T const * end() const
end iterator
void clear()
clear the sequence
#define OPENGM_ASSERT(expression)
void reserve(const size_t)
reserve memory
bool empty() const
query if the sequence is empty
T const * ConstIteratorType
void resize(const size_t)
resize the sequence
T const * begin() const
begin iterator
FastSequence< T, MAX_STACK > & operator=(const FastSequence< T, MAX_STACK > &)
assignment operator
const T & back() const
reference to the last entry