File templatvector.h
File List > code_source > templat > include > TempLat > util > templatvector.h
Go to the documentation of this file
#ifndef TEMPLAT_UTIL_TempLatVECTOR_H
#define TEMPLAT_UTIL_TempLatVECTOR_H
/* This file is part of TempLat, available at https://cosmolattice.github.io/templat .
Copyright 2021-2026 The TempLat authors, see AUTHORS.md.
Released under the MIT license, see LICENSE.md. */
// File info: Main contributor(s): Adrien Florio, Year: 2019
#include <initializer_list>
#include "TempLat/util/rangeiteration/tagliteral.h"
#include "TempLat/lattice/algebra/helpers/getcomponent.h"
#include "TempLat/util/rangeiteration/make_list_tag.h"
namespace TempLat
{
template <typename T, int shift = 0> class TempLatVector
{
public:
// Put public methods here. These should change very little over time.
TempLatVector() = default;
TempLatVector(const std::vector<T> &vec) : mVec(vec) {}
TempLatVector(std::vector<T> &&vec) : mVec(std::move(vec)) {}
template <typename... Args>
TempLatVector(Args... args)
: mVec({static_cast<T>(args)...}) {
};
TempLatVector(std::initializer_list<T> l)
: mVec(l) {
};
TempLatVector(size_t n)
: mVec(n) {
};
TempLatVector(size_t n, T val)
: mVec(n, val) {
};
std::vector<T> &asVec() { return mVec; }
/* operator std::vector<T>()
{
return mVec;
}*/
template <int N> T getComp(Tag<N> t) const noexcept { return mVec[N]; }
T operator[](device::Idx i) const { return mVec[i]; }
T &operator[](device::Idx i) { return mVec[i]; }
T operator()(device::Idx i) const { return mVec[i - shift]; }
T &operator()(device::Idx i) { return mVec[i - shift]; }
size_t size() const { return mVec.size(); }
void push_back(const T &val) { mVec.push_back(val); }
void push_back(T &&val) { mVec.push_back(std::move(val)); }
auto emplace_back(T &&val) { return mVec.emplace_back(std::move(val)); }
auto &back() { return mVec.back(); }
using Getter = GetComponent;
private:
/* Put all member variables and private methods here. These may change arbitrarily. */
std::vector<T> mVec;
};
template <typename... Args> auto make_templatvector(Args... args)
{
auto list = make_list(args...);
return TempLatVector<std::decay_t<decltype(list.getComp(0_c))>>(args...);
}
} // namespace TempLat
#endif