text: #ifndef _ASDFDAFVVAFF_PYCUDA_HEADER_SEEN_TOOLS_HPP
  #define _ASDFDAFVVAFF_PYCUDA_HEADER_SEEN_TOOLS_HPP
  
  
  #include <pybind11/pybind11.h>
  
  #include <numeric>
  #include "numpy_init.hpp"
  
  
  
  
  namespace pyopencl
  {
    inline
    npy_intp size_from_dims(int ndim, const npy_intp *dims)
    {
      if (ndim != 0)
        return std::accumulate(dims, dims+ndim, 1, std::multiplies<npy_intp>());
      else
        return 1;
    }
  
  
  
  
    inline void run_python_gc()
    {
      namespace py = pybind11;
  
      py::module::import("gc").attr("collect")();
    }
  
  
    // https://stackoverflow.com/a/28139075
    template <typename T>
    struct reversion_wrapper { T& iterable; };
  
    template <typename T>
    auto begin (reversion_wrapper<T> w) { return w.iterable.rbegin(); }
  
    template <typename T>
    auto end (reversion_wrapper<T> w) { return w.iterable.rend(); }
  
    template <typename T>
    reversion_wrapper<T> reverse (T&& iterable) { return { iterable }; }
  
  
    // https://stackoverflow.com/a/44175911
    class noncopyable {
    public:
      noncopyable() = default;
      ~noncopyable() = default;
  
    private:
      noncopyable(const noncopyable&) = delete;
      noncopyable& operator=(const noncopyable&) = delete;
    };
  }
  
  
  
  
  
  #endif
  