blob: c67f3e6e0743bc42dd942826ddc7ab37992cb59e [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2015 fortiss GmbH
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Alois Zoitl
* - initial API and implementation and/or initial documentation
*******************************************************************************/
#ifndef FIXEDCAPVECTOR_H_
#define FIXEDCAPVECTOR_H_
#include "fortearray.h"
namespace forte {
namespace core {
namespace util {
/*!\brief A vector having a fixed size array as data storage.
*
* Allows to push_back items, pop items, access the items, iterate over, and clear them.
*/
template<typename T, size_t Capacity, typename TDataStorage = CArray<T, Capacity> >
class CFixedCapazityVector{
public:
CFixedCapazityVector() :
mNumElements(0){
}
void clear(){
mNumElements = 0;
}
bool pushBack(const T & paVal){
bool retVal = false;
if(mNumElements < Capacity){
mDataStorage[mNumElements] = paVal;
mNumElements++;
retVal = true;
}
return retVal;
}
void popBack(){
if(0 < mNumElements){
mNumElements--;
}
}
T& front(){
return mDataStorage[0];
}
T& back(){
return mDataStorage[mNumElements - 1];
}
T& operator [](size_t paIndex){
assert(paIndex < Capacity);
return mDataStorage[paIndex];
}
bool isEmpty() const{
return (0 == mNumElements);
}
size_t size() const {
return mNumElements;
}
class CIterator{
public:
CIterator(CFixedCapazityVector &paVector, size_t paPos) : mVector(paVector), mPos(paPos){
}
CIterator& operator++(){
if(mPos < mVector.size()){
mPos++;
}
return *this;
}
T& operator*(){
return mVector[mPos];
}
bool operator==(CIterator const& rhs) const{
return mPos == rhs.mPos;
}
bool operator!=(CIterator const& rhs) const{
return !(*this == rhs);
}
bool isLastEntry(){
return (mPos == (mVector.size() -1));
}
private:
CFixedCapazityVector &mVector;
size_t mPos;
};
const CIterator begin(){
return CIterator(*this, 0);
}
const CIterator end(){
return CIterator(*this, mNumElements);
}
private:
TDataStorage mDataStorage;
size_t mNumElements; //!< number of all elements currently in this container
};
} // namespace util
} // namespace core
} // namespace forte
#endif // FIXEDCAPVECTOR_H_