// @topic S-0314-09-03-20 C++ template class demo II
// @brief template class Storage

// Storage.h
#ifndef STORAGE_H_INCLUDED_
#define STORAGE_H_INCLUDED_

template< typename ValueType >
class Storage {
    unsigned int count;
    ValueType* storage;
public:
    Storage( unsigned int element_count ) {
        allocate( element_count );
    }
    ~Storage() {
        delete[] storage;
    }
    void allocate( unsigned int element_count ) {
        storage = new ValueType[ element_count ];
        count = element_count;
    }
    void reallocate( unsigned int factor ) {
        ValueType* temp = new ValueType[ count * factor ];
        for ( unsigned int idx = 0; idx < count; ++idx ) {
            temp[ idx ] = storage[ idx ];
        }
        delete[] storage;
        storage = temp;
        count = count * factor;
    }
    void store( ValueType value, unsigned int idx ) {
        storage[ idx ] = value;
    }
    ValueType get( unsigned int idx ) {
        return storage[ idx ];
    }

    unsigned int size() {
        return count;
    }
};//class Storage

#endif //STORAGE_H_INCLUDED_