diff --git a/thirdparty/cnpy/cnpy.h b/thirdparty/cnpy/cnpy.h index 10159d3b529..360f33d7e4d 100644 --- a/thirdparty/cnpy/cnpy.h +++ b/thirdparty/cnpy/cnpy.h @@ -19,21 +19,49 @@ #include #include +#if defined(_WIN32) +#define NOMINMAX +#include +#else +#include +#endif + namespace cnpy { struct NpyArray { + unsigned long long GetFreeMemorySize() { +#if defined(_WIN32) + MEMORYSTATUSEX status; + status.dwLength = sizeof(status); + GlobalMemoryStatusEx(&status); + return status.ullAvailPhys; +#elif defined(__APPLE__) + return std::numeric_limits::max(); +#else + long pages = sysconf(_SC_AVPHYS_PAGES); + long page_size = sysconf(_SC_PAGE_SIZE); + return pages * page_size; +#endif + } + NpyArray(const std::vector& _shape, size_t _word_size, bool _fortran_order) : shape(_shape), word_size(_word_size), fortran_order(_fortran_order) { num_vals = 1; for(size_t i = 0;i < shape.size();i++) num_vals *= shape[i]; if (word_size && - num_vals > std::vector().max_size() / word_size) + num_vals > (GetFreeMemorySize() / word_size)) throw std::length_error("NpyArray of " + std::to_string(num_vals) + "*" + std::to_string(word_size) + " elements is too big."); - data_holder = std::shared_ptr>( - new std::vector(num_vals * word_size)); + try { + data_holder = std::shared_ptr>( + new std::vector(num_vals * word_size)); + } catch (std::bad_alloc const &) { + throw std::length_error("NpyArray of " + std::to_string(num_vals) + + "*" + std::to_string(word_size) + + " elements is too big."); + } } NpyArray() : shape(0), word_size(0), fortran_order(0), num_vals(0) { }