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