Skip to content

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