1 // This file is part of Eigen, a lightweight C++ template library 2 // for linear algebra. 3 // 4 // Copyright (C) 2014 Benoit Steiner <benoit.steiner.goog@gmail.com> 5 // 6 // This Source Code Form is subject to the terms of the Mozilla 7 // Public License v. 2.0. If a copy of the MPL was not distributed 8 // with this file, You can obtain one at http://mozilla.org/MPL/2.0/. 9 10 #ifndef EIGEN_CXX11_TENSOR_TENSOR_INITIALIZER_H 11 #define EIGEN_CXX11_TENSOR_TENSOR_INITIALIZER_H 12 13 #if EIGEN_HAS_VARIADIC_TEMPLATES 14 15 #include <initializer_list> 16 17 namespace Eigen { 18 19 /** \class TensorInitializer 20 * \ingroup CXX11_Tensor_Module 21 * 22 * \brief Helper template to initialize Tensors from std::initializer_lists. 23 */ 24 namespace internal { 25 26 template <typename Derived, int N> 27 struct Initializer { 28 typedef std::initializer_list< 29 typename Initializer<Derived, N - 1>::InitList> InitList; 30 runInitializer31 static void run(TensorEvaluator<Derived, DefaultDevice>& tensor, 32 Eigen::array<typename traits<Derived>::Index, traits<Derived>::NumDimensions>* indices, 33 const InitList& vals) { 34 int i = 0; 35 for (auto v : vals) { 36 (*indices)[traits<Derived>::NumDimensions - N] = i++; 37 Initializer<Derived, N - 1>::run(tensor, indices, v); 38 } 39 } 40 }; 41 42 template <typename Derived> 43 struct Initializer<Derived, 1> { 44 typedef std::initializer_list<typename traits<Derived>::Scalar> InitList; 45 46 static void run(TensorEvaluator<Derived, DefaultDevice>& tensor, 47 Eigen::array<typename traits<Derived>::Index, traits<Derived>::NumDimensions>* indices, 48 const InitList& vals) { 49 int i = 0; 50 // There is likely a faster way to do that than iterating. 51 for (auto v : vals) { 52 (*indices)[traits<Derived>::NumDimensions - 1] = i++; 53 tensor.coeffRef(*indices) = v; 54 } 55 } 56 }; 57 58 template <typename Derived> 59 struct Initializer<Derived, 0> { 60 typedef typename traits<Derived>::Scalar InitList; 61 62 static void run(TensorEvaluator<Derived, DefaultDevice>& tensor, 63 Eigen::array<typename traits<Derived>::Index, traits<Derived>::NumDimensions>*, 64 const InitList& v) { 65 tensor.coeffRef(0) = v; 66 } 67 }; 68 69 70 template <typename Derived, int N> 71 void initialize_tensor(TensorEvaluator<Derived, DefaultDevice>& tensor, 72 const typename Initializer<Derived, traits<Derived>::NumDimensions>::InitList& vals) { 73 Eigen::array<typename traits<Derived>::Index, traits<Derived>::NumDimensions> indices; 74 Initializer<Derived, traits<Derived>::NumDimensions>::run(tensor, &indices, vals); 75 } 76 77 } // namespace internal 78 } // namespace Eigen 79 80 #endif // EIGEN_HAS_VARIADIC_TEMPLATES 81 82 #endif // EIGEN_CXX11_TENSOR_TENSOR_INITIALIZER_H 83