1c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This file is part of Eigen, a lightweight C++ template library 2c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// for linear algebra. 3c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// 4c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud@inria.fr> 5c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com> 6c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// 7c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This Source Code Form is subject to the terms of the Mozilla 8c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Public License v. 2.0. If a copy of the MPL was not distributed 9c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. 10c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 11c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef EIGEN_META_H 12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_META_H 13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace Eigen { 15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace internal { 17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal 19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \file Meta.h 20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * This file contains generic metaprogramming classes which are not specifically related to Eigen. 21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \note In case you wonder, yes we're aware that Boost already provides all these features, 22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * we however don't want to add a dependency to Boost. 23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct true_type { enum { value = 1 }; }; 26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct false_type { enum { value = 0 }; }; 27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<bool Condition, typename Then, typename Else> 29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct conditional { typedef Then type; }; 30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Then, typename Else> 32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct conditional <false, Then, Else> { typedef Else type; }; 33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T, typename U> struct is_same { enum { value = 0 }; }; 35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T> struct is_same<T,T> { enum { value = 1 }; }; 36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T> struct remove_reference { typedef T type; }; 38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T> struct remove_reference<T&> { typedef T type; }; 39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T> struct remove_pointer { typedef T type; }; 41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T> struct remove_pointer<T*> { typedef T type; }; 42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T> struct remove_pointer<T*const> { typedef T type; }; 43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate <class T> struct remove_const { typedef T type; }; 45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate <class T> struct remove_const<const T> { typedef T type; }; 46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate <class T> struct remove_const<const T[]> { typedef T type[]; }; 47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate <class T, unsigned int Size> struct remove_const<const T[Size]> { typedef T type[Size]; }; 48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T> struct remove_all { typedef T type; }; 50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T> struct remove_all<const T> { typedef typename remove_all<T>::type type; }; 51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T> struct remove_all<T const&> { typedef typename remove_all<T>::type type; }; 52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T> struct remove_all<T&> { typedef typename remove_all<T>::type type; }; 53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T> struct remove_all<T const*> { typedef typename remove_all<T>::type type; }; 54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T> struct remove_all<T*> { typedef typename remove_all<T>::type type; }; 55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T> struct is_arithmetic { enum { value = false }; }; 57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<> struct is_arithmetic<float> { enum { value = true }; }; 58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<> struct is_arithmetic<double> { enum { value = true }; }; 59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<> struct is_arithmetic<long double> { enum { value = true }; }; 60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<> struct is_arithmetic<bool> { enum { value = true }; }; 61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<> struct is_arithmetic<char> { enum { value = true }; }; 62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<> struct is_arithmetic<signed char> { enum { value = true }; }; 63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<> struct is_arithmetic<unsigned char> { enum { value = true }; }; 64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<> struct is_arithmetic<signed short> { enum { value = true }; }; 65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<> struct is_arithmetic<unsigned short>{ enum { value = true }; }; 66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<> struct is_arithmetic<signed int> { enum { value = true }; }; 67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<> struct is_arithmetic<unsigned int> { enum { value = true }; }; 68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<> struct is_arithmetic<signed long> { enum { value = true }; }; 69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<> struct is_arithmetic<unsigned long> { enum { value = true }; }; 70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate <typename T> struct add_const { typedef const T type; }; 72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate <typename T> struct add_const<T&> { typedef T& type; }; 73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate <typename T> struct is_const { enum { value = 0 }; }; 75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate <typename T> struct is_const<T const> { enum { value = 1 }; }; 76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T> struct add_const_on_value_type { typedef const T type; }; 78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T> struct add_const_on_value_type<T&> { typedef T const& type; }; 79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T> struct add_const_on_value_type<T*> { typedef T const* type; }; 80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T> struct add_const_on_value_type<T* const> { typedef T const* const type; }; 81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T> struct add_const_on_value_type<T const* const> { typedef T const* const type; }; 82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal Allows to enable/disable an overload 84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * according to a compile time condition. 85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<bool Condition, typename T> struct enable_if; 87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T> struct enable_if<true,T> 89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ typedef T type; }; 90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal 94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * A base class do disable default copy ctor and copy assignement operator. 95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathclass noncopyable 97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath noncopyable(const noncopyable&); 99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const noncopyable& operator=(const noncopyable&); 100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathprotected: 101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath noncopyable() {} 102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ~noncopyable() {} 103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 105c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal 107c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Convenient struct to get the result type of a unary or binary functor. 108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * It supports both the current STL mechanism (using the result_type member) as well as 110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * upcoming next STL generation (using a templated result member). 111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * If none of these members is provided, then the type of the first argument is returned. FIXME, that behavior is a pretty bad hack. 112c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 113c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T> struct result_of {}; 114c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 115c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct has_none {int a[1];}; 116c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct has_std_result_type {int a[2];}; 117c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct has_tr1_result {int a[3];}; 118c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 119c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Func, typename ArgType, int SizeOf=sizeof(has_none)> 120c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct unary_result_of_select {typedef ArgType type;}; 121c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 122c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Func, typename ArgType> 123c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct unary_result_of_select<Func, ArgType, sizeof(has_std_result_type)> {typedef typename Func::result_type type;}; 124c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 125c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Func, typename ArgType> 126c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct unary_result_of_select<Func, ArgType, sizeof(has_tr1_result)> {typedef typename Func::template result<Func(ArgType)>::type type;}; 127c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 128c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Func, typename ArgType> 129c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct result_of<Func(ArgType)> { 130c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename T> 131c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath static has_std_result_type testFunctor(T const *, typename T::result_type const * = 0); 132c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename T> 133c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath static has_tr1_result testFunctor(T const *, typename T::template result<T(ArgType)>::type const * = 0); 134c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath static has_none testFunctor(...); 135c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 136c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // note that the following indirection is needed for gcc-3.3 137c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum {FunctorType = sizeof(testFunctor(static_cast<Func*>(0)))}; 138c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename unary_result_of_select<Func, ArgType, FunctorType>::type type; 139c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 140c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 141c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Func, typename ArgType0, typename ArgType1, int SizeOf=sizeof(has_none)> 142c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct binary_result_of_select {typedef ArgType0 type;}; 143c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 144c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Func, typename ArgType0, typename ArgType1> 145c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct binary_result_of_select<Func, ArgType0, ArgType1, sizeof(has_std_result_type)> 146c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{typedef typename Func::result_type type;}; 147c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 148c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Func, typename ArgType0, typename ArgType1> 149c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct binary_result_of_select<Func, ArgType0, ArgType1, sizeof(has_tr1_result)> 150c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{typedef typename Func::template result<Func(ArgType0,ArgType1)>::type type;}; 151c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 152c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Func, typename ArgType0, typename ArgType1> 153c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct result_of<Func(ArgType0,ArgType1)> { 154c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename T> 155c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath static has_std_result_type testFunctor(T const *, typename T::result_type const * = 0); 156c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename T> 157c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath static has_tr1_result testFunctor(T const *, typename T::template result<T(ArgType0,ArgType1)>::type const * = 0); 158c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath static has_none testFunctor(...); 159c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 160c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // note that the following indirection is needed for gcc-3.3 161c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum {FunctorType = sizeof(testFunctor(static_cast<Func*>(0)))}; 162c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename binary_result_of_select<Func, ArgType0, ArgType1, FunctorType>::type type; 163c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 164c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 165c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal In short, it computes int(sqrt(\a Y)) with \a Y an integer. 166c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Usage example: \code meta_sqrt<1023>::ret \endcode 167c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 168c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<int Y, 169c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int InfX = 0, 170c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int SupX = ((Y==1) ? 1 : Y/2), 171c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath bool Done = ((SupX-InfX)<=1 ? true : ((SupX*SupX <= Y) && ((SupX+1)*(SupX+1) > Y))) > 172c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // use ?: instead of || just to shut up a stupid gcc 4.3 warning 173c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathclass meta_sqrt 174c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 175c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { 176c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath MidX = (InfX+SupX)/2, 177c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath TakeInf = MidX*MidX > Y ? 1 : 0, 178c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath NewInf = int(TakeInf) ? InfX : int(MidX), 179c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath NewSup = int(TakeInf) ? int(MidX) : SupX 180c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath }; 181c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath public: 182c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { ret = meta_sqrt<Y,NewInf,NewSup>::ret }; 183c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 184c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 185c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<int Y, int InfX, int SupX> 186c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathclass meta_sqrt<Y, InfX, SupX, true> { public: enum { ret = (SupX*SupX <= Y) ? SupX : InfX }; }; 187c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 188c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal determines whether the product of two numeric types is allowed and what the return type is */ 1897faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandeztemplate<typename T, typename U> struct scalar_product_traits 1907faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez{ 1917faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez enum { Defined = 0 }; 1927faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez}; 193c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 194c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T> struct scalar_product_traits<T,T> 195c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 1967faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez enum { 1977faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez // Cost = NumTraits<T>::MulCost, 1987faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez Defined = 1 1997faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez }; 200c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef T ReturnType; 201c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 202c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 203c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T> struct scalar_product_traits<T,std::complex<T> > 204c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 2057faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez enum { 2067faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez // Cost = 2*NumTraits<T>::MulCost, 2077faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez Defined = 1 2087faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez }; 209c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef std::complex<T> ReturnType; 210c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 211c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 212c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T> struct scalar_product_traits<std::complex<T>, T> 213c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 2147faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez enum { 2157faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez // Cost = 2*NumTraits<T>::MulCost, 2167faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez Defined = 1 2177faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez }; 218c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef std::complex<T> ReturnType; 219c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 220c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 221c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// FIXME quick workaround around current limitation of result_of 222c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// template<typename Scalar, typename ArgType0, typename ArgType1> 223c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// struct result_of<scalar_product_op<Scalar>(ArgType0,ArgType1)> { 224c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// typedef typename scalar_product_traits<typename remove_all<ArgType0>::type, typename remove_all<ArgType1>::type>::ReturnType type; 225c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// }; 226c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 227c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T> struct is_diagonal 228c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { ret = false }; }; 229c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 230c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T> struct is_diagonal<DiagonalBase<T> > 231c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { ret = true }; }; 232c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 233c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T> struct is_diagonal<DiagonalWrapper<T> > 234c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { ret = true }; }; 235c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 236c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T, int S> struct is_diagonal<DiagonalMatrix<T,S> > 237c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { ret = true }; }; 238c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 239c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace internal 240c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 241c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace Eigen 242c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 243c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // EIGEN_META_H 244