12b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// This file is part of Eigen, a lightweight C++ template library 22b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// for linear algebra. 32b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// 42b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// Copyright (C) 2014 Benoit Steiner <benoit.steiner.goog@gmail.com> 52b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// 62b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// This Source Code Form is subject to the terms of the Mozilla 72b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// Public License v. 2.0. If a copy of the MPL was not distributed 82b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. 92b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 102b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang#ifndef EIGEN_CXX11_TENSOR_TENSOR_INDEX_LIST_H 112b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang#define EIGEN_CXX11_TENSOR_TENSOR_INDEX_LIST_H 122b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 132b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 142b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang#if EIGEN_HAS_CONSTEXPR && EIGEN_HAS_VARIADIC_TEMPLATES 152b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 162b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang#define EIGEN_HAS_INDEX_LIST 172b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 182b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangnamespace Eigen { 192b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 202b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang/** \internal 212b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang * 222b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang * \class TensorIndexList 232b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang * \ingroup CXX11_Tensor_Module 242b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang * 252b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang * \brief Set of classes used to encode a set of Tensor dimensions/indices. 262b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang * 272b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang * The indices in the list can be known at compile time or at runtime. A mix 282b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang * of static and dynamic indices can also be provided if needed. The tensor 292b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang * code will attempt to take advantage of the indices that are known at 302b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang * compile time to optimize the code it generates. 312b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang * 322b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang * This functionality requires a c++11 compliant compiler. If your compiler 332b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang * is older you need to use arrays of indices instead. 342b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang * 352b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang * Several examples are provided in the cxx11_tensor_index_list.cpp file. 362b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang * 372b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang * \sa Tensor 382b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang */ 392b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 402b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate <DenseIndex n> 412b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct type2index { 422b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang static const DenseIndex value = n; 432b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang EIGEN_DEVICE_FUNC constexpr operator DenseIndex() const { return n; } 442b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang EIGEN_DEVICE_FUNC void set(DenseIndex val) { 452b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang eigen_assert(val == n); 462b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 472b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}; 482b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 492b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// This can be used with IndexPairList to get compile-time constant pairs, 502b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// such as IndexPairList<type2indexpair<1,2>, type2indexpair<3,4>>(). 512b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate <DenseIndex f, DenseIndex s> 522b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct type2indexpair { 532b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang static const DenseIndex first = f; 542b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang static const DenseIndex second = s; 552b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 562b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang constexpr EIGEN_DEVICE_FUNC operator IndexPair<DenseIndex>() const { 572b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return IndexPair<DenseIndex>(f, s); 582b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 592b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 602b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang EIGEN_DEVICE_FUNC void set(const IndexPair<DenseIndex>& val) { 612b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang eigen_assert(val.first == f); 622b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang eigen_assert(val.second == s); 632b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 642b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}; 652b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 662b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 672b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<DenseIndex n> struct NumTraits<type2index<n> > 682b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{ 692b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang typedef DenseIndex Real; 702b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang enum { 712b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang IsComplex = 0, 722b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang RequireInitialization = false, 732b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang ReadCost = 1, 742b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang AddCost = 1, 752b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang MulCost = 1 762b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang }; 772b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 782b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang EIGEN_DEVICE_FUNC static inline Real epsilon() { return 0; } 792b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang EIGEN_DEVICE_FUNC static inline Real dummy_precision() { return 0; } 802b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang EIGEN_DEVICE_FUNC static inline Real highest() { return n; } 812b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang EIGEN_DEVICE_FUNC static inline Real lowest() { return n; } 822b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}; 832b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 842b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangnamespace internal { 852b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate <typename T> 862b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao WangEIGEN_DEVICE_FUNC void update_value(T& val, DenseIndex new_val) { 872b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang val = new_val; 882b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang} 892b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate <DenseIndex n> 902b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao WangEIGEN_DEVICE_FUNC void update_value(type2index<n>& val, DenseIndex new_val) { 912b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang val.set(new_val); 922b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang} 932b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 942b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate <typename T> 952b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao WangEIGEN_DEVICE_FUNC void update_value(T& val, IndexPair<DenseIndex> new_val) { 962b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang val = new_val; 972b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang} 982b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate <DenseIndex f, DenseIndex s> 992b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao WangEIGEN_DEVICE_FUNC void update_value(type2indexpair<f, s>& val, IndexPair<DenseIndex> new_val) { 1002b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang val.set(new_val); 1012b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang} 1022b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 1032b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 1042b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate <typename T> 1052b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct is_compile_time_constant { 1062b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang static constexpr bool value = false; 1072b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}; 1082b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 1092b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate <DenseIndex idx> 1102b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct is_compile_time_constant<type2index<idx> > { 1112b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang static constexpr bool value = true; 1122b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}; 1132b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate <DenseIndex idx> 1142b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct is_compile_time_constant<const type2index<idx> > { 1152b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang static constexpr bool value = true; 1162b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}; 1172b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate <DenseIndex idx> 1182b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct is_compile_time_constant<type2index<idx>& > { 1192b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang static constexpr bool value = true; 1202b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}; 1212b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate <DenseIndex idx> 1222b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct is_compile_time_constant<const type2index<idx>& > { 1232b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang static constexpr bool value = true; 1242b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}; 1252b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 1262b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate <DenseIndex f, DenseIndex s> 1272b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct is_compile_time_constant<type2indexpair<f, s> > { 1282b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang static constexpr bool value = true; 1292b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}; 1302b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate <DenseIndex f, DenseIndex s> 1312b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct is_compile_time_constant<const type2indexpair<f, s> > { 1322b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang static constexpr bool value = true; 1332b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}; 1342b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate <DenseIndex f, DenseIndex s> 1352b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct is_compile_time_constant<type2indexpair<f, s>& > { 1362b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang static constexpr bool value = true; 1372b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}; 1382b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate <DenseIndex f, DenseIndex s> 1392b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct is_compile_time_constant<const type2indexpair<f, s>& > { 1402b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang static constexpr bool value = true; 1412b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}; 1422b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 1432b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 1442b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename... T> 1452b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct IndexTuple; 1462b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 1472b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename T, typename... O> 1482b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct IndexTuple<T, O...> { 1492b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang EIGEN_DEVICE_FUNC constexpr IndexTuple() : head(), others() { } 1502b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang EIGEN_DEVICE_FUNC constexpr IndexTuple(const T& v, const O... o) : head(v), others(o...) { } 1512b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 1522b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang constexpr static int count = 1 + sizeof...(O); 1532b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang T head; 1542b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang IndexTuple<O...> others; 1552b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang typedef T Head; 1562b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang typedef IndexTuple<O...> Other; 1572b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}; 1582b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 1592b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename T> 1602b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang struct IndexTuple<T> { 1612b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang EIGEN_DEVICE_FUNC constexpr IndexTuple() : head() { } 1622b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang EIGEN_DEVICE_FUNC constexpr IndexTuple(const T& v) : head(v) { } 1632b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 1642b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang constexpr static int count = 1; 1652b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang T head; 1662b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang typedef T Head; 1672b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}; 1682b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 1692b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 1702b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<int N, typename... T> 1712b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct IndexTupleExtractor; 1722b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 1732b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<int N, typename T, typename... O> 1742b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct IndexTupleExtractor<N, T, O...> { 1752b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 1762b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang typedef typename IndexTupleExtractor<N-1, O...>::ValType ValType; 1772b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 1782b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang EIGEN_DEVICE_FUNC static constexpr ValType& get_val(IndexTuple<T, O...>& val) { 1792b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return IndexTupleExtractor<N-1, O...>::get_val(val.others); 1802b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 1812b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 1822b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang EIGEN_DEVICE_FUNC static constexpr const ValType& get_val(const IndexTuple<T, O...>& val) { 1832b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return IndexTupleExtractor<N-1, O...>::get_val(val.others); 1842b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 1852b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang template <typename V> 1862b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang EIGEN_DEVICE_FUNC static void set_val(IndexTuple<T, O...>& val, V& new_val) { 1872b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang IndexTupleExtractor<N-1, O...>::set_val(val.others, new_val); 1882b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 1892b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 1902b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}; 1912b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 1922b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename T, typename... O> 1932b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang struct IndexTupleExtractor<0, T, O...> { 1942b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 1952b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang typedef T ValType; 1962b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 1972b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang EIGEN_DEVICE_FUNC static constexpr ValType& get_val(IndexTuple<T, O...>& val) { 1982b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return val.head; 1992b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 2002b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang EIGEN_DEVICE_FUNC static constexpr const ValType& get_val(const IndexTuple<T, O...>& val) { 2012b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return val.head; 2022b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 2032b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang template <typename V> 2042b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang EIGEN_DEVICE_FUNC static void set_val(IndexTuple<T, O...>& val, V& new_val) { 2052b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang val.head = new_val; 2062b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 2072b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}; 2082b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 2092b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 2102b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 2112b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate <int N, typename T, typename... O> 2122b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao WangEIGEN_DEVICE_FUNC constexpr typename IndexTupleExtractor<N, T, O...>::ValType& array_get(IndexTuple<T, O...>& tuple) { 2132b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return IndexTupleExtractor<N, T, O...>::get_val(tuple); 2142b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang} 2152b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate <int N, typename T, typename... O> 2162b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao WangEIGEN_DEVICE_FUNC constexpr const typename IndexTupleExtractor<N, T, O...>::ValType& array_get(const IndexTuple<T, O...>& tuple) { 2172b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return IndexTupleExtractor<N, T, O...>::get_val(tuple); 2182b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang} 2192b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate <typename T, typename... O> 2202b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang struct array_size<IndexTuple<T, O...> > { 2212b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang static const size_t value = IndexTuple<T, O...>::count; 2222b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}; 2232b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate <typename T, typename... O> 2242b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang struct array_size<const IndexTuple<T, O...> > { 2252b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang static const size_t value = IndexTuple<T, O...>::count; 2262b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}; 2272b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 2282b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 2292b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 2302b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 2312b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate <DenseIndex Idx, typename ValueT> 2322b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct tuple_coeff { 2332b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang template <typename... T> 2342b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang EIGEN_DEVICE_FUNC static constexpr ValueT get(const DenseIndex i, const IndexTuple<T...>& t) { 2352b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang // return array_get<Idx>(t) * (i == Idx) + tuple_coeff<Idx-1>::get(i, t) * (i != Idx); 2362b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return (i == Idx ? array_get<Idx>(t) : tuple_coeff<Idx-1, ValueT>::get(i, t)); 2372b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 2382b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang template <typename... T> 2392b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang EIGEN_DEVICE_FUNC static void set(const DenseIndex i, IndexTuple<T...>& t, const ValueT& value) { 2402b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang if (i == Idx) { 2412b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang update_value(array_get<Idx>(t), value); 2422b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } else { 2432b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang tuple_coeff<Idx-1, ValueT>::set(i, t, value); 2442b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 2452b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 2462b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 2472b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang template <typename... T> 2482b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang EIGEN_DEVICE_FUNC static constexpr bool value_known_statically(const DenseIndex i, const IndexTuple<T...>& t) { 2492b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return ((i == Idx) & is_compile_time_constant<typename IndexTupleExtractor<Idx, T...>::ValType>::value) || 2502b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang tuple_coeff<Idx-1, ValueT>::value_known_statically(i, t); 2512b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 2522b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 2532b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang template <typename... T> 2542b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang EIGEN_DEVICE_FUNC static constexpr bool values_up_to_known_statically(const IndexTuple<T...>& t) { 2552b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return is_compile_time_constant<typename IndexTupleExtractor<Idx, T...>::ValType>::value && 2562b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang tuple_coeff<Idx-1, ValueT>::values_up_to_known_statically(t); 2572b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 2582b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 2592b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang template <typename... T> 2602b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang EIGEN_DEVICE_FUNC static constexpr bool values_up_to_statically_known_to_increase(const IndexTuple<T...>& t) { 2612b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return is_compile_time_constant<typename IndexTupleExtractor<Idx, T...>::ValType>::value && 2622b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang is_compile_time_constant<typename IndexTupleExtractor<Idx, T...>::ValType>::value && 2632b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang array_get<Idx>(t) > array_get<Idx-1>(t) && 2642b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang tuple_coeff<Idx-1, ValueT>::values_up_to_statically_known_to_increase(t); 2652b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 2662b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}; 2672b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 2682b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate <typename ValueT> 2692b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct tuple_coeff<0, ValueT> { 2702b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang template <typename... T> 2712b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang EIGEN_DEVICE_FUNC static constexpr ValueT get(const DenseIndex /*i*/, const IndexTuple<T...>& t) { 2722b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang // eigen_assert (i == 0); // gcc fails to compile assertions in constexpr 2732b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return array_get<0>(t)/* * (i == 0)*/; 2742b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 2752b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang template <typename... T> 2762b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang EIGEN_DEVICE_FUNC static void set(const DenseIndex i, IndexTuple<T...>& t, const ValueT value) { 2772b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang eigen_assert (i == 0); 2782b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang update_value(array_get<0>(t), value); 2792b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 2802b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang template <typename... T> 2812b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang EIGEN_DEVICE_FUNC static constexpr bool value_known_statically(const DenseIndex i, const IndexTuple<T...>&) { 2822b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return is_compile_time_constant<typename IndexTupleExtractor<0, T...>::ValType>::value & (i == 0); 2832b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 2842b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 2852b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang template <typename... T> 2862b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang EIGEN_DEVICE_FUNC static constexpr bool values_up_to_known_statically(const IndexTuple<T...>&) { 2872b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return is_compile_time_constant<typename IndexTupleExtractor<0, T...>::ValType>::value; 2882b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 2892b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 2902b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang template <typename... T> 2912b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang EIGEN_DEVICE_FUNC static constexpr bool values_up_to_statically_known_to_increase(const IndexTuple<T...>&) { 2922b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return true; 2932b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 2942b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}; 2952b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang} // namespace internal 2962b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 2972b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 2982b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 2992b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename FirstType, typename... OtherTypes> 3002b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct IndexList : internal::IndexTuple<FirstType, OtherTypes...> { 3012b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC constexpr DenseIndex operator[] (const DenseIndex i) const { 3022b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return internal::tuple_coeff<internal::array_size<internal::IndexTuple<FirstType, OtherTypes...> >::value-1, DenseIndex>::get(i, *this); 3032b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 3042b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC constexpr DenseIndex get(const DenseIndex i) const { 3052b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return internal::tuple_coeff<internal::array_size<internal::IndexTuple<FirstType, OtherTypes...> >::value-1, DenseIndex>::get(i, *this); 3062b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 3072b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC void set(const DenseIndex i, const DenseIndex value) { 3082b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return internal::tuple_coeff<internal::array_size<internal::IndexTuple<FirstType, OtherTypes...> >::value-1, DenseIndex>::set(i, *this, value); 3092b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 3102b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 3112b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang EIGEN_DEVICE_FUNC constexpr IndexList(const internal::IndexTuple<FirstType, OtherTypes...>& other) : internal::IndexTuple<FirstType, OtherTypes...>(other) { } 3122b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang EIGEN_DEVICE_FUNC constexpr IndexList(FirstType& first, OtherTypes... other) : internal::IndexTuple<FirstType, OtherTypes...>(first, other...) { } 3132b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang EIGEN_DEVICE_FUNC constexpr IndexList() : internal::IndexTuple<FirstType, OtherTypes...>() { } 3142b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 3152b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang EIGEN_DEVICE_FUNC constexpr bool value_known_statically(const DenseIndex i) const { 3162b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return internal::tuple_coeff<internal::array_size<internal::IndexTuple<FirstType, OtherTypes...> >::value-1, DenseIndex>::value_known_statically(i, *this); 3172b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 3182b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang EIGEN_DEVICE_FUNC constexpr bool all_values_known_statically() const { 3192b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return internal::tuple_coeff<internal::array_size<internal::IndexTuple<FirstType, OtherTypes...> >::value-1, DenseIndex>::values_up_to_known_statically(*this); 3202b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 3212b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 3222b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang EIGEN_DEVICE_FUNC constexpr bool values_statically_known_to_increase() const { 3232b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return internal::tuple_coeff<internal::array_size<internal::IndexTuple<FirstType, OtherTypes...> >::value-1, DenseIndex>::values_up_to_statically_known_to_increase(*this); 3242b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 3252b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}; 3262b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 3272b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 3282b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename FirstType, typename... OtherTypes> 3292b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangconstexpr IndexList<FirstType, OtherTypes...> make_index_list(FirstType val1, OtherTypes... other_vals) { 3302b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return IndexList<FirstType, OtherTypes...>(val1, other_vals...); 3312b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang} 3322b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 3332b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 3342b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename FirstType, typename... OtherTypes> 3352b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct IndexPairList : internal::IndexTuple<FirstType, OtherTypes...> { 3362b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC constexpr IndexPair<DenseIndex> operator[] (const DenseIndex i) const { 3372b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return internal::tuple_coeff<internal::array_size<internal::IndexTuple<FirstType, OtherTypes...> >::value-1, IndexPair<DenseIndex>>::get(i, *this); 3382b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 3392b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC void set(const DenseIndex i, const IndexPair<DenseIndex> value) { 3402b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return internal::tuple_coeff<internal::array_size<internal::IndexTuple<FirstType, OtherTypes...>>::value-1, IndexPair<DenseIndex> >::set(i, *this, value); 3412b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 3422b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 3432b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang EIGEN_DEVICE_FUNC constexpr IndexPairList(const internal::IndexTuple<FirstType, OtherTypes...>& other) : internal::IndexTuple<FirstType, OtherTypes...>(other) { } 3442b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang EIGEN_DEVICE_FUNC constexpr IndexPairList() : internal::IndexTuple<FirstType, OtherTypes...>() { } 3452b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 3462b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang EIGEN_DEVICE_FUNC constexpr bool value_known_statically(const DenseIndex i) const { 3472b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return internal::tuple_coeff<internal::array_size<internal::IndexTuple<FirstType, OtherTypes...> >::value-1, DenseIndex>::value_known_statically(i, *this); 3482b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 3492b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}; 3502b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 3512b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangnamespace internal { 3522b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 3532b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename FirstType, typename... OtherTypes> size_t array_prod(const IndexList<FirstType, OtherTypes...>& sizes) { 3542b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang size_t result = 1; 3552b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang for (int i = 0; i < array_size<IndexList<FirstType, OtherTypes...> >::value; ++i) { 3562b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang result *= sizes[i]; 3572b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 3582b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return result; 3592b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang} 3602b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 3612b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename FirstType, typename... OtherTypes> struct array_size<IndexList<FirstType, OtherTypes...> > { 3622b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang static const size_t value = array_size<IndexTuple<FirstType, OtherTypes...> >::value; 3632b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}; 3642b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename FirstType, typename... OtherTypes> struct array_size<const IndexList<FirstType, OtherTypes...> > { 3652b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang static const size_t value = array_size<IndexTuple<FirstType, OtherTypes...> >::value; 3662b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}; 3672b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 3682b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename FirstType, typename... OtherTypes> struct array_size<IndexPairList<FirstType, OtherTypes...> > { 3692b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang static const size_t value = std::tuple_size<std::tuple<FirstType, OtherTypes...> >::value; 3702b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}; 3712b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename FirstType, typename... OtherTypes> struct array_size<const IndexPairList<FirstType, OtherTypes...> > { 3722b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang static const size_t value = std::tuple_size<std::tuple<FirstType, OtherTypes...> >::value; 3732b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}; 3742b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 3752b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<DenseIndex N, typename FirstType, typename... OtherTypes> EIGEN_DEVICE_FUNC constexpr DenseIndex array_get(IndexList<FirstType, OtherTypes...>& a) { 3762b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return IndexTupleExtractor<N, FirstType, OtherTypes...>::get_val(a); 3772b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang} 3782b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<DenseIndex N, typename FirstType, typename... OtherTypes> EIGEN_DEVICE_FUNC constexpr DenseIndex array_get(const IndexList<FirstType, OtherTypes...>& a) { 3792b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return IndexTupleExtractor<N, FirstType, OtherTypes...>::get_val(a); 3802b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang} 3812b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 3822b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate <typename T> 3832b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct index_known_statically_impl { 3842b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang EIGEN_DEVICE_FUNC static constexpr bool run(const DenseIndex) { 3852b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return false; 3862b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 3872b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}; 3882b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 3892b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate <typename FirstType, typename... OtherTypes> 3902b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct index_known_statically_impl<IndexList<FirstType, OtherTypes...> > { 3912b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang EIGEN_DEVICE_FUNC static constexpr bool run(const DenseIndex i) { 3922b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return IndexList<FirstType, OtherTypes...>().value_known_statically(i); 3932b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 3942b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}; 3952b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 3962b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate <typename FirstType, typename... OtherTypes> 3972b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct index_known_statically_impl<const IndexList<FirstType, OtherTypes...> > { 3982b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang EIGEN_DEVICE_FUNC static constexpr bool run(const DenseIndex i) { 3992b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return IndexList<FirstType, OtherTypes...>().value_known_statically(i); 4002b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 4012b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}; 4022b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 4032b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 4042b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate <typename T> 4052b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct all_indices_known_statically_impl { 4062b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang static constexpr bool run() { 4072b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return false; 4082b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 4092b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}; 4102b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 4112b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate <typename FirstType, typename... OtherTypes> 4122b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct all_indices_known_statically_impl<IndexList<FirstType, OtherTypes...> > { 4132b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang EIGEN_DEVICE_FUNC static constexpr bool run() { 4142b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return IndexList<FirstType, OtherTypes...>().all_values_known_statically(); 4152b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 4162b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}; 4172b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 4182b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate <typename FirstType, typename... OtherTypes> 4192b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct all_indices_known_statically_impl<const IndexList<FirstType, OtherTypes...> > { 4202b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang EIGEN_DEVICE_FUNC static constexpr bool run() { 4212b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return IndexList<FirstType, OtherTypes...>().all_values_known_statically(); 4222b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 4232b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}; 4242b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 4252b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 4262b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate <typename T> 4272b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct indices_statically_known_to_increase_impl { 4282b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang EIGEN_DEVICE_FUNC static constexpr bool run() { 4292b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return false; 4302b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 4312b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}; 4322b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 4332b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate <typename FirstType, typename... OtherTypes> 4342b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang struct indices_statically_known_to_increase_impl<IndexList<FirstType, OtherTypes...> > { 4352b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang EIGEN_DEVICE_FUNC static constexpr bool run() { 4362b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return Eigen::IndexList<FirstType, OtherTypes...>().values_statically_known_to_increase(); 4372b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 4382b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}; 4392b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 4402b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate <typename FirstType, typename... OtherTypes> 4412b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang struct indices_statically_known_to_increase_impl<const IndexList<FirstType, OtherTypes...> > { 4422b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang EIGEN_DEVICE_FUNC static constexpr bool run() { 4432b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return Eigen::IndexList<FirstType, OtherTypes...>().values_statically_known_to_increase(); 4442b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 4452b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}; 4462b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 4472b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 4482b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate <typename Tx> 4492b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct index_statically_eq_impl { 4502b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang EIGEN_DEVICE_FUNC static constexpr bool run(DenseIndex, DenseIndex) { 4512b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return false; 4522b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 4532b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}; 4542b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 4552b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate <typename FirstType, typename... OtherTypes> 4562b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct index_statically_eq_impl<IndexList<FirstType, OtherTypes...> > { 4572b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang EIGEN_DEVICE_FUNC static constexpr bool run(const DenseIndex i, const DenseIndex value) { 4582b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return IndexList<FirstType, OtherTypes...>().value_known_statically(i) & 4592b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang (IndexList<FirstType, OtherTypes...>().get(i) == value); 4602b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 4612b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}; 4622b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 4632b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate <typename FirstType, typename... OtherTypes> 4642b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct index_statically_eq_impl<const IndexList<FirstType, OtherTypes...> > { 4652b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang EIGEN_DEVICE_FUNC static constexpr bool run(const DenseIndex i, const DenseIndex value) { 4662b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return IndexList<FirstType, OtherTypes...>().value_known_statically(i) & 4672b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang (IndexList<FirstType, OtherTypes...>().get(i) == value); 4682b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 4692b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}; 4702b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 4712b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 4722b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate <typename T> 4732b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct index_statically_ne_impl { 4742b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang EIGEN_DEVICE_FUNC static constexpr bool run(DenseIndex, DenseIndex) { 4752b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return false; 4762b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 4772b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}; 4782b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 4792b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate <typename FirstType, typename... OtherTypes> 4802b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct index_statically_ne_impl<IndexList<FirstType, OtherTypes...> > { 4812b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang EIGEN_DEVICE_FUNC static constexpr bool run(const DenseIndex i, const DenseIndex value) { 4822b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return IndexList<FirstType, OtherTypes...>().value_known_statically(i) & 4832b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang (IndexList<FirstType, OtherTypes...>().get(i) != value); 4842b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 4852b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}; 4862b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 4872b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate <typename FirstType, typename... OtherTypes> 4882b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct index_statically_ne_impl<const IndexList<FirstType, OtherTypes...> > { 4892b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang EIGEN_DEVICE_FUNC static constexpr bool run(const DenseIndex i, const DenseIndex value) { 4902b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return IndexList<FirstType, OtherTypes...>().value_known_statically(i) & 4912b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang (IndexList<FirstType, OtherTypes...>().get(i) != value); 4922b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 4932b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}; 4942b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 4952b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 4962b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate <typename T> 4972b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct index_statically_gt_impl { 4982b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang EIGEN_DEVICE_FUNC static constexpr bool run(DenseIndex, DenseIndex) { 4992b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return false; 5002b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 5012b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}; 5022b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 5032b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate <typename FirstType, typename... OtherTypes> 5042b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct index_statically_gt_impl<IndexList<FirstType, OtherTypes...> > { 5052b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang EIGEN_DEVICE_FUNC static constexpr bool run(const DenseIndex i, const DenseIndex value) { 5062b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return IndexList<FirstType, OtherTypes...>().value_known_statically(i) & 5072b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang (IndexList<FirstType, OtherTypes...>().get(i) > value); 5082b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 5092b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}; 5102b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 5112b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate <typename FirstType, typename... OtherTypes> 5122b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct index_statically_gt_impl<const IndexList<FirstType, OtherTypes...> > { 5132b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang EIGEN_DEVICE_FUNC static constexpr bool run(const DenseIndex i, const DenseIndex value) { 5142b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return IndexList<FirstType, OtherTypes...>().value_known_statically(i) & 5152b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang (IndexList<FirstType, OtherTypes...>().get(i) > value); 5162b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 5172b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}; 5182b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 5192b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 5202b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 5212b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate <typename T> 5222b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct index_statically_lt_impl { 5232b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang EIGEN_DEVICE_FUNC static constexpr bool run(DenseIndex, DenseIndex) { 5242b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return false; 5252b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 5262b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}; 5272b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 5282b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate <typename FirstType, typename... OtherTypes> 5292b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct index_statically_lt_impl<IndexList<FirstType, OtherTypes...> > { 5302b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang EIGEN_DEVICE_FUNC static constexpr bool run(const DenseIndex i, const DenseIndex value) { 5312b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return IndexList<FirstType, OtherTypes...>().value_known_statically(i) & 5322b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang (IndexList<FirstType, OtherTypes...>().get(i) < value); 5332b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 5342b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}; 5352b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 5362b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate <typename FirstType, typename... OtherTypes> 5372b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct index_statically_lt_impl<const IndexList<FirstType, OtherTypes...> > { 5382b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang EIGEN_DEVICE_FUNC static constexpr bool run(const DenseIndex i, const DenseIndex value) { 5392b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return IndexList<FirstType, OtherTypes...>().value_known_statically(i) & 5402b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang (IndexList<FirstType, OtherTypes...>().get(i) < value); 5412b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 5422b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}; 5432b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 5442b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 5452b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 5462b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate <typename Tx> 5472b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct index_pair_first_statically_eq_impl { 5482b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang EIGEN_DEVICE_FUNC static constexpr bool run(DenseIndex, DenseIndex) { 5492b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return false; 5502b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 5512b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}; 5522b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 5532b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate <typename FirstType, typename... OtherTypes> 5542b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct index_pair_first_statically_eq_impl<IndexPairList<FirstType, OtherTypes...> > { 5552b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang EIGEN_DEVICE_FUNC static constexpr bool run(const DenseIndex i, const DenseIndex value) { 5562b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return IndexPairList<FirstType, OtherTypes...>().value_known_statically(i) & 5572b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang (IndexPairList<FirstType, OtherTypes...>().operator[](i).first == value); 5582b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 5592b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}; 5602b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 5612b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate <typename FirstType, typename... OtherTypes> 5622b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct index_pair_first_statically_eq_impl<const IndexPairList<FirstType, OtherTypes...> > { 5632b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang EIGEN_DEVICE_FUNC static constexpr bool run(const DenseIndex i, const DenseIndex value) { 5642b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return IndexPairList<FirstType, OtherTypes...>().value_known_statically(i) & 5652b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang (IndexPairList<FirstType, OtherTypes...>().operator[](i).first == value); 5662b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 5672b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}; 5682b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 5692b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 5702b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 5712b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate <typename Tx> 5722b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct index_pair_second_statically_eq_impl { 5732b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang EIGEN_DEVICE_FUNC static constexpr bool run(DenseIndex, DenseIndex) { 5742b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return false; 5752b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 5762b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}; 5772b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 5782b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate <typename FirstType, typename... OtherTypes> 5792b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct index_pair_second_statically_eq_impl<IndexPairList<FirstType, OtherTypes...> > { 5802b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang EIGEN_DEVICE_FUNC static constexpr bool run(const DenseIndex i, const DenseIndex value) { 5812b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return IndexPairList<FirstType, OtherTypes...>().value_known_statically(i) & 5822b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang (IndexPairList<FirstType, OtherTypes...>().operator[](i).second == value); 5832b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 5842b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}; 5852b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 5862b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate <typename FirstType, typename... OtherTypes> 5872b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct index_pair_second_statically_eq_impl<const IndexPairList<FirstType, OtherTypes...> > { 5882b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang EIGEN_DEVICE_FUNC static constexpr bool run(const DenseIndex i, const DenseIndex value) { 5892b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return IndexPairList<FirstType, OtherTypes...>().value_known_statically(i) & 5902b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang (IndexPairList<FirstType, OtherTypes...>().operator[](i).second == value); 5912b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 5922b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}; 5932b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 5942b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 5952b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang} // end namespace internal 5962b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang} // end namespace Eigen 5972b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 5982b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang#else 5992b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 6002b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangnamespace Eigen { 6012b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangnamespace internal { 6022b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 6032b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate <typename T> 6042b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct index_known_statically_impl { 6052b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang static EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE bool run(const DenseIndex) { 6062b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return false; 6072b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 6082b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}; 6092b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 6102b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate <typename T> 6112b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct all_indices_known_statically_impl { 6122b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang static EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE bool run() { 6132b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return false; 6142b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 6152b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}; 6162b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 6172b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate <typename T> 6182b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct indices_statically_known_to_increase_impl { 6192b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang static EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE bool run() { 6202b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return false; 6212b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 6222b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}; 6232b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 6242b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate <typename T> 6252b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct index_statically_eq_impl { 6262b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang static EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE bool run(DenseIndex, DenseIndex) { 6272b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return false; 6282b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 6292b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}; 6302b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 6312b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate <typename T> 6322b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct index_statically_ne_impl { 6332b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang static EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE bool run(DenseIndex, DenseIndex) { 6342b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return false; 6352b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 6362b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}; 6372b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 6382b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate <typename T> 6392b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct index_statically_gt_impl { 6402b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang static EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE bool run(DenseIndex, DenseIndex) { 6412b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return false; 6422b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 6432b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}; 6442b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 6452b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate <typename T> 6462b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct index_statically_lt_impl { 6472b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang static EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE bool run(DenseIndex, DenseIndex) { 6482b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return false; 6492b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 6502b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}; 6512b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 6522b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate <typename Tx> 6532b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct index_pair_first_statically_eq_impl { 6542b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang static EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE bool run(DenseIndex, DenseIndex) { 6552b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return false; 6562b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 6572b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}; 6582b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 6592b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate <typename Tx> 6602b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct index_pair_second_statically_eq_impl { 6612b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang static EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE bool run(DenseIndex, DenseIndex) { 6622b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return false; 6632b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 6642b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}; 6652b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 6662b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 6672b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 6682b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang} // end namespace internal 6692b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang} // end namespace Eigen 6702b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 6712b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang#endif 6722b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 6732b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 6742b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangnamespace Eigen { 6752b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangnamespace internal { 6762b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate <typename T> 6772b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstatic EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR bool index_known_statically(DenseIndex i) { 6782b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return index_known_statically_impl<T>::run(i); 6792b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang} 6802b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 6812b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate <typename T> 6822b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstatic EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR bool all_indices_known_statically() { 6832b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return all_indices_known_statically_impl<T>::run(); 6842b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang} 6852b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 6862b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate <typename T> 6872b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstatic EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR bool indices_statically_known_to_increase() { 6882b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return indices_statically_known_to_increase_impl<T>::run(); 6892b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang} 6902b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 6912b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate <typename T> 6922b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstatic EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR bool index_statically_eq(DenseIndex i, DenseIndex value) { 6932b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return index_statically_eq_impl<T>::run(i, value); 6942b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang} 6952b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 6962b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate <typename T> 6972b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstatic EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR bool index_statically_ne(DenseIndex i, DenseIndex value) { 6982b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return index_statically_ne_impl<T>::run(i, value); 6992b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang} 7002b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 7012b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate <typename T> 7022b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstatic EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR bool index_statically_gt(DenseIndex i, DenseIndex value) { 7032b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return index_statically_gt_impl<T>::run(i, value); 7042b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang} 7052b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 7062b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate <typename T> 7072b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstatic EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR bool index_statically_lt(DenseIndex i, DenseIndex value) { 7082b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return index_statically_lt_impl<T>::run(i, value); 7092b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang} 7102b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 7112b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate <typename T> 7122b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstatic EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR bool index_pair_first_statically_eq(DenseIndex i, DenseIndex value) { 7132b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return index_pair_first_statically_eq_impl<T>::run(i, value); 7142b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang} 7152b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 7162b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate <typename T> 7172b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstatic EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR bool index_pair_second_statically_eq(DenseIndex i, DenseIndex value) { 7182b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang return index_pair_second_statically_eq_impl<T>::run(i, value); 7192b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang} 7202b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 7212b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang} // end namespace internal 7222b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang} // end namespace Eigen 7232b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 7242b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 7252b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang#endif // EIGEN_CXX11_TENSOR_TENSOR_INDEX_LIST_H 726