// This file is part of Eigen, a lightweight C++ template library // for linear algebra. // // Copyright (C) 2011 Benoit Jacob // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed // with this file, You can obtain one at http://mozilla.org/MPL/2.0/. #ifndef EIGEN2_META_H #define EIGEN2_META_H namespace Eigen { template struct ei_traits : internal::traits {}; struct ei_meta_true { enum { ret = 1 }; }; struct ei_meta_false { enum { ret = 0 }; }; template struct ei_meta_if { typedef Then ret; }; template struct ei_meta_if { typedef Else ret; }; template struct ei_is_same_type { enum { ret = 0 }; }; template struct ei_is_same_type { enum { ret = 1 }; }; template struct ei_unref { typedef T type; }; template struct ei_unref { typedef T type; }; template struct ei_unpointer { typedef T type; }; template struct ei_unpointer { typedef T type; }; template struct ei_unpointer { typedef T type; }; template struct ei_unconst { typedef T type; }; template struct ei_unconst { typedef T type; }; template struct ei_unconst { typedef T & type; }; template struct ei_unconst { typedef T * type; }; template struct ei_cleantype { typedef T type; }; template struct ei_cleantype { typedef typename ei_cleantype::type type; }; template struct ei_cleantype { typedef typename ei_cleantype::type type; }; template struct ei_cleantype { typedef typename ei_cleantype::type type; }; template struct ei_cleantype { typedef typename ei_cleantype::type type; }; template struct ei_cleantype { typedef typename ei_cleantype::type type; }; /** \internal In short, it computes int(sqrt(\a Y)) with \a Y an integer. * Usage example: \code ei_meta_sqrt<1023>::ret \endcode */ template Y))) > // use ?: instead of || just to shut up a stupid gcc 4.3 warning class ei_meta_sqrt { enum { MidX = (InfX+SupX)/2, TakeInf = MidX*MidX > Y ? 1 : 0, NewInf = int(TakeInf) ? InfX : int(MidX), NewSup = int(TakeInf) ? int(MidX) : SupX }; public: enum { ret = ei_meta_sqrt::ret }; }; template class ei_meta_sqrt { public: enum { ret = (SupX*SupX <= Y) ? SupX : InfX }; }; } // end namespace Eigen #endif // EIGEN2_META_H