Program Listing for File traits.h

Return to documentation for file (manif/impl/traits.h)

#ifndef _MANIF_MANIF_TRAITS_H_
#define _MANIF_MANIF_TRAITS_H_

#include <array>
#include <type_traits>

namespace manif {

template <typename Derived> struct LieGroupBase;
template <typename Derived> struct TangentBase;

namespace internal {

//template <typename T>
//inline constexpr bool constexpr_false() {
//    return false;
//}

template <typename T>
struct constexpr_false : std::false_type {};

template <typename T> struct traits;

template<typename T> struct traits<const T> : traits<T> {};

template <typename _LieGroupBase> struct LieGroupProperties;

template <typename _Class, typename _NewScalar>
struct traitscast;

template <
  template <typename, template<typename> class...> class _Class,
  typename _Scalar,
  typename _NewScalar,
  template<typename> class ... Ts>
struct traitscast<_Class<_Scalar, Ts...>, _NewScalar>
{
  using cast = _Class<_NewScalar, Ts...>;
};

template <
  template <typename, unsigned int> class _Class,
  typename _NewScalar,
  typename _Scalar,
  unsigned int _Dim>
struct traitscast<_Class<_Scalar, _Dim>, _NewScalar>
{
  using cast = _Class<_NewScalar, _Dim>;
};

template <typename Scalar> struct is_ad : std::integral_constant<bool, false> { };

template<class, typename T> struct has_rjacinv_impl : std::false_type {};
template<typename T> struct
has_rjacinv_impl<decltype( void(std::declval<T>().rjacinv()) ), T> : std::true_type {};
template<typename T> struct has_rjacinv : has_rjacinv_impl<void, T> {};

template<class, typename T> struct has_ljacinv_impl : std::false_type {};
template<typename T> struct
has_ljacinv_impl<decltype( void(std::declval<T>().ljacinv()) ), T> : std::true_type {};
template<typename T> struct has_ljacinv : has_ljacinv_impl<void, T> {};


template<int ... _I>
struct intseq
{
  using value_type = int;
  static constexpr std::size_t size() noexcept {return sizeof...(_I);}
};

template<typename _Seq1, typename _Seq2>
struct intseq_join;

template<template<int ...> class _IntSeq, int ... _I1, int ... _I2>
struct intseq_join<_IntSeq<_I1...>, _IntSeq<_I2...>>
{
  using type = _IntSeq<_I1..., _I2...>;
};

template<std::size_t _N>
struct make_intseq
{
  using type = typename intseq_join<
    typename make_intseq<_N - 1>::type, intseq<_N - 1>
  >::type;
};

template<>
struct make_intseq<0>
{
  using type = intseq<>;
};

template <std::size_t _N>
using make_intseq_t = typename make_intseq<_N>::type;

template <typename T>
constexpr T accumulate(T t) {
  return t;
}

template <typename T, typename... Rest>
constexpr T accumulate(T t, Rest... rest) {
  return t + accumulate(rest...);
}

template <int N, int i, int j, int ...Args> struct compute_indices_gen {
  static constexpr std::array<int, sizeof...(Args)+1> get() {
    return compute_indices_gen<N-1, i+j, Args..., i+j>::get();
  }
};
template <int i, int j, int ...Args> struct compute_indices_gen<1, i, j, Args...> {
  static constexpr std::array<int, sizeof...(Args)+1> get() {
    return { { 0, Args... } };
  }
};
template <int... Args> constexpr std::array<int, sizeof...(Args)> compute_indices() {
  return compute_indices_gen<sizeof...(Args), 0, Args...>::get();
}

// traits to check if a template parameter has a LieGroupBase base.
template <typename Derived>
void test_lie_group_base(LieGroupBase<Derived>&& s) {}

template <class, typename T> struct is_manif_group_impl : std::false_type {};
template <typename T> struct
is_manif_group_impl<decltype(test_lie_group_base(std::declval<T>())), T>
  : std::true_type {};
template <typename T> struct is_manif_group
  : is_manif_group_impl<void, T> {};

// traits to check if a template parameter has a TangentBase base.
template <typename Derived>
void test_tangent_base(TangentBase<Derived>&& s) {}

template <class, typename T> struct is_manif_tangent_impl : std::false_type {};
template <typename T> struct
is_manif_tangent_impl<decltype(test_tangent_base(std::declval<T>())), T>
  : std::true_type {};
template <typename T> struct is_manif_tangent
  : is_manif_tangent_impl<void, T> {};

} /* namespace internal */
} /* namespace manif */

#endif /* _MANIF_MANIF_TRAITS_H_ */