| Server IP : 217.160.0.212 / Your IP : 216.73.216.141 Web Server : Apache System : Linux www 6.18.51-i1-ampere #1196 SMP Fri Sep 11 20:43:55 CEST 2026 aarch64 User : sws1073854427 ( 1073854427) PHP Version : 8.4.23 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : OFF | Pkexec : OFF Directory : /lib/python3/dist-packages/pythran/pythonic/include/utils/ |
Upload File : |
#ifndef PYTHONIC_INCLUDE_UTILS_NESTED_CONTAINER_HPP
#define PYTHONIC_INCLUDE_UTILS_NESTED_CONTAINER_HPP
#include <limits>
#include "pythonic/include/types/traits.hpp"
#include "pythonic/include/utils/numpy_traits.hpp"
PYTHONIC_NS_BEGIN
namespace types
{
template <class T, class S>
class sliced_list;
template <class T>
class list;
template <class T, size_t N, class V>
struct array_base;
template <class T>
struct dynamic_tuple;
}
namespace utils
{
/* compute nested container depth && memory size*/
template <class T, bool IsArray>
struct nested_container_depth_helper;
template <class T>
struct nested_container_depth_helper<T, false> {
static const int value = 0;
};
template <class T>
struct nested_container_depth_helper<T, true> {
static const int value = T::value;
};
template <class T>
struct nested_container_depth {
static const int value =
nested_container_depth_helper<T, types::is_array<T>::value>::value;
};
template <class T>
struct nested_container_depth<types::list<T>> {
static const int value = 1 + nested_container_depth<T>::value;
};
template <class T, class S>
struct nested_container_depth<types::sliced_list<T, S>> {
static const int value = 1 + nested_container_depth<T>::value;
};
template <class T>
struct nested_container_depth<types::dynamic_tuple<T>> {
static const int value = 1 + nested_container_depth<T>::value;
};
template <class T, size_t N, class V>
struct nested_container_depth<types::array_base<T, N, V>> {
static const int value = 1 + nested_container_depth<T>::value;
};
template <class T, class sP>
struct nested_container_depth<types::ndarray<T, sP>> {
static const int value = std::tuple_size<sP>::value;
};
/* Get the size of a container, using recursion on inner container if any
* FIXME: should be a constexpr?
* FIXME: why a class && ! a function?
*/
template <class T>
struct nested_container_size {
using Type =
typename std::remove_cv<typename std::remove_reference<T>::type>::type;
static long flat_size(T const &t);
};
/* Recursion stops on bool */
template <>
struct nested_container_size<bool> {
template <class F>
constexpr static long flat_size(F);
};
/* Statically define (by recursion) the type of element inside nested
* containers */
template <class T, bool IsArray>
struct nested_container_value_type_helper;
template <class T>
struct nested_container_value_type_helper<T, false> {
using type = T;
};
template <class T>
struct nested_container_value_type_helper<T, true> {
using type = typename T::dtype;
};
template <class T>
struct nested_container_value_type {
using type = typename nested_container_value_type_helper<
T, types::is_array<T>::value>::type;
};
template <class T>
struct nested_container_value_type<types::dynamic_tuple<T>> {
using type = typename nested_container_value_type<T>::type;
};
template <class T>
struct nested_container_value_type<types::list<T>> {
using type = typename nested_container_value_type<T>::type;
};
template <class T, class S>
struct nested_container_value_type<types::sliced_list<T, S>> {
using type = typename nested_container_value_type<T>::type;
};
template <class T, size_t N, class V>
struct nested_container_value_type<types::array_base<T, N, V>> {
using type = typename nested_container_value_type<T>::type;
};
template <class T, class sP>
struct nested_container_value_type<types::ndarray<T, sP>> {
using type = T;
};
}
PYTHONIC_NS_END
#endif