blob: fcaa449deaf8f53676afd61b7443995bbd78b22e [file] [log] [blame]
#ifndef VTR_VECTOR
#define VTR_VECTOR
#include <vector>
#include <cstddef>
namespace vtr {
//A std::vector container which is indexed by K (instead of size_t).
//
//The main use of this container is to behave like a std::vector which is
//indexed by a vtr::StrongId.
//
//If you need more std::map-like (instead of std::vector-like) behaviour see
//vtr::vector_map.
template<typename K, typename V>
class vector : private std::vector<V> {
public:
//Pass through std::vector's types
using typename std::vector<V>::value_type;
using typename std::vector<V>::allocator_type;
using typename std::vector<V>::reference;
using typename std::vector<V>::const_reference;
using typename std::vector<V>::pointer;
using typename std::vector<V>::const_pointer;
using typename std::vector<V>::iterator;
using typename std::vector<V>::const_iterator;
using typename std::vector<V>::reverse_iterator;
using typename std::vector<V>::const_reverse_iterator;
using typename std::vector<V>::difference_type;
using typename std::vector<V>::size_type;
//Pass through std::vector's methods
using std::vector<V>::vector;
using std::vector<V>::begin;
using std::vector<V>::end;
using std::vector<V>::rbegin;
using std::vector<V>::rend;
using std::vector<V>::cbegin;
using std::vector<V>::cend;
using std::vector<V>::crbegin;
using std::vector<V>::crend;
using std::vector<V>::size;
using std::vector<V>::max_size;
using std::vector<V>::resize;
using std::vector<V>::capacity;
using std::vector<V>::empty;
using std::vector<V>::reserve;
using std::vector<V>::shrink_to_fit;
using std::vector<V>::front;
using std::vector<V>::back;
using std::vector<V>::data;
using std::vector<V>::assign;
using std::vector<V>::push_back;
using std::vector<V>::pop_back;
using std::vector<V>::insert;
using std::vector<V>::erase;
using std::vector<V>::swap;
using std::vector<V>::clear;
using std::vector<V>::emplace;
using std::vector<V>::emplace_back;
using std::vector<V>::get_allocator;
//Don't include operator[] and at() from std::vector,
//since we redine them to take K instead of size_t
reference operator[](const K id) {
auto i = size_t(id);
return std::vector<V>::operator[](i);
}
const_reference operator[](const K id) const {
auto i = size_t(id);
return std::vector<V>::operator[](i);
}
reference at(const K id) {
auto i = size_t(id);
return std::vector<V>::at(i);
}
const_reference at(const K id) const {
auto i = size_t(id);
return std::vector<V>::at(i);
}
};
} //namespace
#endif