22#ifndef _libint2_include_tensor_h_
23#define _libint2_include_tensor_h_
25#include <libint2/util/cxxstd.h>
26#if LIBINT2_CPLUSPLUS_STD < 2011
27# error "The simple Libint API requires C++11 support"
44 template <
class ... Dims>
Tensor(Dims ... dims) : dims_{ std::forward<Dims>(dims)... } {
45 strides_.resize(
sizeof...(dims));
49 stride() : value(1) {}
50 size_t operator()(
size_t dim) {
auto old_value = value; value *= dim;
return old_value; }
53 std::transform(dims_.rbegin(), dims_.rend(),
54 strides_.rbegin(), stride());
55 size_t size = strides_.size() == 0 ? 0 : strides_[0] * dims_[0];
59 T* data() {
return &data_[0]; }
60 const T* data()
const {
return static_cast<const T*
>(this->data()); }
61 template <
class ... MultiIndex> T* data(MultiIndex ... index) {
62 assert(
sizeof...(MultiIndex) <= dims_.size());
63 auto index_list = { std::forward<MultiIndex>(index)... };
64 size_t ordinal = std::inner_product(index_list.begin(), index_list.end(),
66 return &data_[ordinal];
68 template <
class ... MultiIndex>
const T* data(MultiIndex ... index)
const {
69 return static_cast<const T*
>(this->data());
72 template <
class ... MultiIndex>
const T& operator()(MultiIndex ... index) {
73 assert(
sizeof...(MultiIndex) == dims_.size());
74 auto index_list = { std::forward<MultiIndex>(index)... };
75 size_t ordinal = std::inner_product(index_list.begin(), index_list.end(),
77 return data_[ordinal];
81 std::vector<size_t> dims_;
82 std::vector<size_t> strides_;
Defaults definitions for various parameters assumed by Libint.
Definition: algebra.cc:24