diff --git a/CMakeLists.txt b/CMakeLists.txt index 0bdf0ed..9b62f8a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,29 +1,14 @@ cmake_minimum_required(VERSION 3.14 FATAL_ERROR) -project(libpressio VERSION "0.8.0" LANGUAGES CXX C) +project(libpressio VERSION "0.9.0" LANGUAGES CXX C) enable_testing() set(CMAKE_EXPORT_COMPILE_COMMANDS ON) option(BUILD_SHARED_LIBS "build libpressio as a shared library" ON) include(GNUInstallDirs) -find_package(ZFP REQUIRED) -find_package(SZ REQUIRED) -find_package(ZLIB REQUIRED) -find_package(PkgConfig REQUIRED) -find_package(Python COMPONENTS Interpreter Development NumPy) -pkg_search_module(ZSTD IMPORTED_TARGET GLOBAL libzstd) -set(LIBPRESSIO_FEATURES "sz zfp") -configure_file( - ${CMAKE_CURRENT_SOURCE_DIR}/include/pressio_version.h.in - ${CMAKE_CURRENT_BINARY_DIR}/include/pressio_version.h - ) -configure_file( - ${CMAKE_CURRENT_SOURCE_DIR}/libpressio.pc.in - ${CMAKE_CURRENT_BINARY_DIR}/libpressio.pc - @ONLY - ) +set(LIBPRESSIO_FEATURES "") add_library(libpressio #core implementation @@ -38,8 +23,6 @@ add_library(libpressio #plugins ./src/plugins/compressors/compressor_base.cc - ./src/plugins/compressors/sz_plugin.cc - ./src/plugins/compressors/zfp_plugin.cc ./src/plugins/metrics/composite.cc ./src/plugins/metrics/metrics_base.cc ./src/plugins/metrics/size.cc @@ -48,8 +31,6 @@ add_library(libpressio #public headers include/libpressio.h - include/libpressio_ext/compressors/sz.h - include/libpressio_ext/compressors/zfp.h include/libpressio_ext/cpp/compressor.h include/libpressio_ext/cpp/metrics.h include/libpressio_ext/cpp/plugins.h @@ -74,9 +55,57 @@ target_include_directories(libpressio PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/include ) target_compile_options(libpressio PRIVATE $<$: -Wall -Werror -Wextra -Wpedantic>) -target_link_libraries(libpressio PUBLIC zfp::zfp SZ) target_compile_features(libpressio PUBLIC cxx_std_17) +option(LIBPRESSIO_HAS_MGARD "build the MGARD plugin" OFF) +if(LIBPRESSIO_HAS_MGARD) + set(LIBPRESSIO_FEATURES "${LIBPRESSIO_FEATURES} mgard") + find_package(mgard REQUIRED) + target_sources(libpressio + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/src/plugins/compressors/mgard_plugin.cc + ${CMAKE_CURRENT_SOURCE_DIR}/include/libpressio_ext/compressors/mgard.h + ) + target_link_libraries(libpressio PUBLIC mgard::mgard) +endif() + +option(LIBPRESSIO_HAS_ZFP "build the ZFP plugin" ON) +if(LIBPRESSIO_HAS_ZFP) + set(LIBPRESSIO_FEATURES "${LIBPRESSIO_FEATURES} zfp") + find_package(ZFP REQUIRED) + target_sources(libpressio + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/src/plugins/compressors/zfp_plugin.cc + ${CMAKE_CURRENT_SOURCE_DIR}/include/libpressio_ext/compressors/zfp.h + ) + target_link_libraries(libpressio PUBLIC zfp::zfp) +endif() + +option(LIBPRESSIO_HAS_SZ "build the SZ plugin" ON) +if(LIBPRESSIO_HAS_SZ) + set(LIBPRESSIO_FEATURES "${LIBPRESSIO_FEATURES} sz") + find_package(SZ REQUIRED) + find_package(ZLIB REQUIRED) + find_package(PkgConfig REQUIRED) + pkg_search_module(ZSTD IMPORTED_TARGET GLOBAL libzstd) + target_sources(libpressio + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/src/plugins/compressors/sz_plugin.cc + ${CMAKE_CURRENT_SOURCE_DIR}/include/libpressio_ext/compressors/sz.h + ) + target_link_libraries(libpressio PUBLIC SZ) +endif() + +configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/include/pressio_version.h.in + ${CMAKE_CURRENT_BINARY_DIR}/include/pressio_version.h + ) +configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/libpressio.pc.in + ${CMAKE_CURRENT_BINARY_DIR}/libpressio.pc + @ONLY + ) + export(TARGETS libpressio NAMESPACE LibPressio:: FILE LibPressio.cmake) install(TARGETS libpressio EXPORT LibPressioConfig ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} @@ -89,7 +118,6 @@ install(FILES ${CMAKE_CURRENT_BINARY_DIR}/include/pressio_version.h DESTINATION install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libpressio.pc DESTINATION ${CMAKE_INSTALL_PREFIX}/share/pkgconfig) option(BUILD_TESTS "build the test cases and examples" OFF) - if(BUILD_TESTS) add_subdirectory(test) endif() diff --git a/COPYRIGHT.txt b/COPYRIGHT.txt index faac82c..e4c46e0 100644 --- a/COPYRIGHT.txt +++ b/COPYRIGHT.txt @@ -1,6 +1,6 @@ Copyright © 2019 , UChicago Argonne, LLC All Rights Reserved -[libpressio, Version 0.8.0] +[libpressio, Version 0.9.0] Robert Underwood Argonne National Laboratory diff --git a/include/libpressio_ext/compressors/mgard.h b/include/libpressio_ext/compressors/mgard.h new file mode 100644 index 0000000..0628432 --- /dev/null +++ b/include/libpressio_ext/compressors/mgard.h @@ -0,0 +1,5 @@ +/** + * \file + * \brief Includes definitions needed to use the MGRAD pressio compressor + * */ +#include diff --git a/include/libpressio_ext/cpp/compressor.h b/include/libpressio_ext/cpp/compressor.h index 66ef2d6..c3c6e98 100644 --- a/include/libpressio_ext/cpp/compressor.h +++ b/include/libpressio_ext/cpp/compressor.h @@ -41,11 +41,11 @@ class libpressio_compressor_plugin { /** compresses a pressio_data buffer * \see pressio_compressor_compress for the semantics this function should obey */ - int compress(struct pressio_data* input, struct pressio_data* output); + int compress(const pressio_data *input, struct pressio_data* output); /** decompress a pressio_data buffer * \see pressio_compressor_decompress for the semantics this function should obey */ - int decompress(struct pressio_data* input, struct pressio_data* output); + int decompress(const pressio_data *input, struct pressio_data* output); /** get a version string for the compressor * \see pressio_compressor_version for the semantics this function should obey */ @@ -123,11 +123,11 @@ class libpressio_compressor_plugin { /** compresses a pressio_data buffer * \see pressio_compressor_compress for the semantics this function should obey */ - virtual int compress_impl(struct pressio_data* input, struct pressio_data* output)=0; + virtual int compress_impl(const pressio_data *input, struct pressio_data* output)=0; /** decompress a pressio_data buffer * \see pressio_compressor_decompress for the semantics this function should obey */ - virtual int decompress_impl(struct pressio_data* input, struct pressio_data* output)=0; + virtual int decompress_impl(const pressio_data *input, struct pressio_data* output)=0; /** checks for extra arguments set for the compressor. * Unlike other functions, this option is NOT required diff --git a/include/libpressio_ext/cpp/data.h b/include/libpressio_ext/cpp/data.h index e3c8315..4eb8a48 100644 --- a/include/libpressio_ext/cpp/data.h +++ b/include/libpressio_ext/cpp/data.h @@ -233,16 +233,23 @@ struct pressio_data { /** * \returns the number of dimensions */ - size_t dimensions() const { + size_t num_dimensions() const { return dims.size(); } + /** + * \returns a copy of the vector of dimensions + */ + std::vector dimensions() const { + return dims; + } + /** * \param idx the specific index to query * \returns a specific dimension of the buffer of zero if the index exceeds dimensions() */ size_t get_dimension(size_t idx) const { - if(idx >= dimensions()) return 0; + if(idx >= num_dimensions()) return 0; else return dims[idx]; } @@ -250,14 +257,14 @@ struct pressio_data { * \returns the size of the buffer in bytes */ size_t size_in_bytes() const { - return data_size_in_bytes(data_dtype, dimensions(), dims.data()); + return data_size_in_bytes(data_dtype, num_dimensions(), dims.data()); } /** * \returns the size of the buffer in elements */ size_t num_elements() const { - return data_size_in_elements(dimensions(), dims.data()); + return data_size_in_elements(num_dimensions(), dims.data()); } private: diff --git a/include/libpressio_ext/cpp/options.h b/include/libpressio_ext/cpp/options.h index 832f7d3..f4cb443 100644 --- a/include/libpressio_ext/cpp/options.h +++ b/include/libpressio_ext/cpp/options.h @@ -1,3 +1,6 @@ +#ifndef PRESSIO_OPTIONS_CPP +#define PRESSIO_OPTIONS_CPP + #include #include #include @@ -53,11 +56,6 @@ struct pressio_option final { template pressio_option(T value): option(std::optional(value)) {} - /** specialization for option to reset the type to hold no type or value - * \param[in] value the monostate singleton - * */ - template<> - pressio_option(std::monostate value): option(value) {} /** returns a pressio option that has the appropriate type if the conversion is allowed for the specified safety * \param[in] type the type to convert to @@ -75,7 +73,7 @@ struct pressio_option final { * \returns returns true if the option holds the current type */ template - constexpr bool holds_alternative() const { + bool holds_alternative() const { return std::holds_alternative>(option); } @@ -83,13 +81,13 @@ struct pressio_option final { * \returns true if the option has no specified type or value */ template <> - constexpr bool holds_alternative() const; + bool holds_alternative() const; /** * \returns a std::optional which holds a value if the option has one or an empty optional otherwise */ template - constexpr std::optional const& get() const{ + std::optional const& get() const{ return std::get>(option); } @@ -98,7 +96,7 @@ struct pressio_option final { * \returns the value contained by the option */ template - constexpr T const& get_value() const{ + T const& get_value() const{ return get().value(); } @@ -187,14 +185,17 @@ struct pressio_option final { option_type option; }; +/** specialization for option to reset the type to hold no type or value + * \param[in] value the monostate singleton + * */ +template<> +pressio_option::pressio_option(std::monostate value); + /** Specialization for the std::monostate singleton * \returns true if the option has no specified type or value */ template <> -constexpr bool pressio_option::holds_alternative() const { - return std::holds_alternative(option); -} - +bool pressio_option::holds_alternative() const; /** * represents a map of dynamically typed objects */ @@ -381,3 +382,5 @@ enum pressio_options_key_status pressio_options::get(std::string const& key, con */ template <> enum pressio_options_key_status pressio_options::cast(std::string const& key, char** value, enum pressio_conversion_safety safety) const; + +#endif diff --git a/include/libpressio_ext/cpp/plugins.h b/include/libpressio_ext/cpp/plugins.h index 5b1a353..10e0856 100644 --- a/include/libpressio_ext/cpp/plugins.h +++ b/include/libpressio_ext/cpp/plugins.h @@ -5,12 +5,24 @@ #define LIBPRESSIO_PLUGINS_PUBLIC #include #include +#include "pressio_version.h" #include "libpressio_ext/cpp/compressor.h" #include "libpressio_ext/cpp/metrics.h" + +#if LIBPRESSIO_HAS_SZ /** construct the sz plugin */ std::unique_ptr make_c_sz(); +#endif + +#if LIBPRESSIO_HAS_ZFP /** construct the zfp plugin */ std::unique_ptr make_c_zfp(); +#endif + +#if LIBPRESSIO_HAS_MGARD +std::unique_ptr make_c_mgard(); +#endif + /** construct the time metrics plugin */ std::unique_ptr make_m_time(); /** construct the size metrics plugin */ diff --git a/include/libpressio_ext/cpp/printers.h b/include/libpressio_ext/cpp/printers.h index ad08cc2..400fec0 100644 --- a/include/libpressio_ext/cpp/printers.h +++ b/include/libpressio_ext/cpp/printers.h @@ -1,6 +1,7 @@ #include #include #include "options.h" +#include "pressio_dtype.h" /** \file * \brief C++ stream compatible IO functions @@ -82,3 +83,37 @@ operator<<(std::basic_ostream& out, pressio_options const& option return out; } +/** + * human readable debugging IO function for pressio_dtype, the format is unspecified + * \param[in] out the stream to write to + * \param[in] type the type to print + */ +template > +std::basic_ostream& +operator<<(std::basic_ostream& out, enum pressio_dtype type) +{ + switch (type) { + case pressio_double_dtype: + return out << "double"; + case pressio_float_dtype: + return out << "float"; + case pressio_uint8_dtype: + return out << "uint8_t"; + case pressio_uint16_dtype: + return out << "uint16_t"; + case pressio_uint32_dtype: + return out << "uint32_t"; + case pressio_uint64_dtype: + return out << "uint64_t"; + case pressio_int8_dtype: + return out << "int8_t"; + case pressio_int16_dtype: + return out << "int16_t"; + case pressio_int32_dtype: + return out << "int32_t"; + case pressio_int64_dtype: + return out << "int64_t"; + case pressio_byte_dtype: + return out << "byte"; + } +} diff --git a/include/pressio_compressor.h b/include/pressio_compressor.h index 60213a8..77e16ec 100644 --- a/include/pressio_compressor.h +++ b/include/pressio_compressor.h @@ -64,7 +64,7 @@ int pressio_compressor_check_options(struct pressio_compressor* compressor, stru * 2. A new owning pressio_data structure with the results of the compression * \returns 0 if successful, positive values on errors, negative values on warnings */ -int pressio_compressor_compress(struct pressio_compressor* compressor, struct pressio_data * input, struct pressio_data* output); +int pressio_compressor_compress(struct pressio_compressor* compressor, const struct pressio_data *input, struct pressio_data* output); /*! * decompresses the compressed data using the specified compressor * calling this without calling libpressio_compressor_set_options() has undefined behavior @@ -80,7 +80,7 @@ int pressio_compressor_compress(struct pressio_compressor* compressor, struct pr * \see pressio_data_new_empty often used as the pointer passed into \c output * \see pressio_data_new_move often used as the pointer passed out of \c output */ -int pressio_compressor_decompress(struct pressio_compressor* compressor, struct pressio_data * input, struct pressio_data* output); +int pressio_compressor_decompress(struct pressio_compressor* compressor, const struct pressio_data *input, struct pressio_data* output); /** * \param[in] compressor the compressor to get results from diff --git a/include/pressio_version.h.in b/include/pressio_version.h.in index f65cbd1..dad9972 100644 --- a/include/pressio_version.h.in +++ b/include/pressio_version.h.in @@ -3,3 +3,5 @@ #define LIBPRESSIO_MAJOR_VERSION @PROJECT_VERSION_MAJOR@ #define LIBPRESSIO_MINOR_VERSION @PROJECT_VERSION_MINOR@ #define LIBPRESSIO_PATCH_VERSION @PROJECT_VERSION_PATCH@ +#cmakedefine01 LIBPRESSIO_HAS_SZ +#cmakedefine01 LIBPRESSIO_HAS_ZFP diff --git a/src/plugins/compressors/compressor_base.cc b/src/plugins/compressors/compressor_base.cc index 7b081e4..02c75e3 100644 --- a/src/plugins/compressors/compressor_base.cc +++ b/src/plugins/compressors/compressor_base.cc @@ -87,14 +87,14 @@ int libpressio_compressor_plugin::set_options(struct pressio_options const* opti return ret; } -int libpressio_compressor_plugin::compress(struct pressio_data* input, struct pressio_data* output) { +int libpressio_compressor_plugin::compress(const pressio_data *input, struct pressio_data* output) { if(metrics_plugin) (*metrics_plugin)->begin_compress(input, output); auto ret = compress_impl(input, output); if(metrics_plugin) (*metrics_plugin)->end_compress(input, output, ret); return ret; } -int libpressio_compressor_plugin::decompress(struct pressio_data* input, struct pressio_data* output) { +int libpressio_compressor_plugin::decompress(const pressio_data *input, struct pressio_data* output) { if(metrics_plugin) (*metrics_plugin)->begin_decompress(input, output); auto ret = decompress_impl(input, output); if(metrics_plugin) (*metrics_plugin)->end_decompress(input, output, ret); diff --git a/src/plugins/compressors/mgard_plugin.cc b/src/plugins/compressors/mgard_plugin.cc new file mode 100644 index 0000000..1505fa0 --- /dev/null +++ b/src/plugins/compressors/mgard_plugin.cc @@ -0,0 +1,177 @@ +#include +#include +#include +#include "pressio_data.h" +#include "pressio_options.h" +#include "libpressio_ext/cpp/data.h" +#include "libpressio_ext/cpp/compressor.h" +#include "libpressio_ext/cpp/options.h" +#include "libpressio_ext/cpp/printers.h" + +namespace { + + template + bool all_has_value(Options const& ... options) { + return ((options.has_value()) && ... ); + } +} + +class mgard_plugin: public libpressio_compressor_plugin { + struct pressio_options * get_options_impl () const override { + struct pressio_options* options = pressio_options_new(); + auto set_if_set = [options](const char* key, pressio_option_type type, pressio_option const& option) { + if(option.has_value()) { + options->set(key, option); + } else { + options->set_type(key, type); + } + }; + set_if_set("mgrad:tol", pressio_option_double_type, tolerance); + set_if_set("mgrad:s", pressio_option_double_type, s); + set_if_set("mgrad:nfib", pressio_option_int32_type, nfib); + return options; + }; + + int set_options_impl (struct pressio_options const *options) override { + auto set_fn = [options](const char* key, pressio_option& option_out) { + if(options->key_status(key) == pressio_options_key_set) { + option_out.cast_set(options->get(key), pressio_conversion_explicit); + } + }; + set_fn("mgrad:tol", tolerance); + set_fn("mgrad:s", s); + set_fn("mgrad:nfib", nfib); + return 0; + } + + int compress_impl (const pressio_data *input, struct pressio_data *output) override { + auto type = pressio_data_dtype(input); + if(!all_has_value(tolerance, s, nfib)) { + return missing_configuration(); + } else if(type != pressio_double_dtype) { + return invalid_type(type); + } else if(pressio_data_num_dimensions(input) != 2) { + return invalid_dims(input); + } + + auto dims = input->dimensions(); + auto input_copy = pressio_data::copy( + input->dtype(), + input->data(), + dims + ); + + int out_size; + double tol = tolerance.get_value(); + unsigned char* compressed_data = mgard_compress( + dtype_to_itype(input_copy.dtype()), + input_copy.data(), + &out_size, + dims.at(0), + dims.at(1), + nfib.get_value(), + &tol, + s.get_value() + ); + std::vector output_dims = {static_cast(out_size)}; + *output = pressio_data::move(pressio_byte_dtype, compressed_data, output_dims, pressio_data_libc_free_fn, nullptr); + + return 0; + }; + + int decompress_impl (const pressio_data *input, struct pressio_data *output) override { + auto type = pressio_data_dtype(output); + if(!all_has_value(s, nfib)) { + return missing_configuration(); + } else if(type != pressio_double_dtype) { + return invalid_type(type); + } else if(pressio_data_num_dimensions(input) != 2) { + return invalid_dims(input); + } + + auto input_copy = pressio_data::copy( + input->dtype(), + input->data(), + input->dimensions() + ); + + + void* decompressed_data = mgard_decompress( + dtype_to_itype(output->dtype()), + static_cast(input_copy.data()), + input->get_dimension(0), + output->get_dimension(0), + output->get_dimension(1), + nfib.get_value(), + s.get_value() + ); + + *output = pressio_data::move(output->dtype(), decompressed_data, output->dimensions(), pressio_data_libc_free_fn, nullptr); + return 0; + } + + public: + int major_version () const override { + return 0; + } + + int minor_version () const override { + return 0; + } + + int patch_version () const override { + return 0; + } + int tweak_version () const { + return 2; + } + + const char* version() const override { + return "0.0.0.2"; + } + + private: + int dtype_to_itype(pressio_dtype type) const { + if(type == pressio_float_dtype) return 1; + else if (type == pressio_double_dtype) return 2; + else return -1; + } + + int missing_configuration() { + std::stringstream ss; + ss << "missing a required configuration elements"; + if(tolerance.has_value()) + ss << "tolerance, "; + if(s.has_value()) + ss << "s, "; + if(nfib.has_value()) + ss << "nfib, "; + + return set_error(1, ss.str()); + } + + int invalid_type(pressio_dtype dtype) { + std::stringstream ss; + ss << "invalid type " << dtype; + return set_error(2, ss.str()); + } + + int invalid_dims(const pressio_data* data) { + std::stringstream ss; + ss << "invalid dimentions (" << pressio_data_get_dimension(data, 0); + for (size_t i = 1; i < pressio_data_num_dimensions(data); ++i) { + ss << ", " << pressio_data_get_dimension(data, i); + } + ss << ")"; + return set_error(3, ss.str()); + } + + pressio_option tolerance; + pressio_option s; + pressio_option nfib; +}; + +std::unique_ptr make_c_mgard() { + return std::make_unique(); +} + diff --git a/src/plugins/compressors/sz_plugin.cc b/src/plugins/compressors/sz_plugin.cc index 52134b7..018b189 100644 --- a/src/plugins/compressors/sz_plugin.cc +++ b/src/plugins/compressors/sz_plugin.cc @@ -89,7 +89,7 @@ class sz_plugin: public libpressio_compressor_plugin { return 0; } - int compress_impl(struct pressio_data* input, struct pressio_data* output) override { + int compress_impl(const pressio_data *input, struct pressio_data* output) override { size_t r1 = pressio_data_get_dimension(input, 0); size_t r2 = pressio_data_get_dimension(input, 1); size_t r3 = pressio_data_get_dimension(input, 2); @@ -108,7 +108,7 @@ class sz_plugin: public libpressio_compressor_plugin { *output = pressio_data::move(pressio_byte_dtype, compressed_data, 1, &outsize, pressio_data_libc_free_fn, nullptr); return 0; } - int decompress_impl(struct pressio_data* input, struct pressio_data* output) override { + int decompress_impl(const pressio_data *input, struct pressio_data* output) override { size_t r[] = { pressio_data_get_dimension(output, 0), diff --git a/src/plugins/compressors/zfp_plugin.cc b/src/plugins/compressors/zfp_plugin.cc index bce2b6b..e3aaf00 100644 --- a/src/plugins/compressors/zfp_plugin.cc +++ b/src/plugins/compressors/zfp_plugin.cc @@ -77,10 +77,11 @@ class zfp_plugin: public libpressio_compressor_plugin { return 0; } - int compress_impl(struct pressio_data* input, struct pressio_data* output) override { + int compress_impl(const pressio_data *input, struct pressio_data* output) override { zfp_field* in_field; - if(int ret = convert_pressio_data_to_field(input, &in_field)) { + auto input_copy = pressio_data::copy(input->dtype(),input->data(), input->dimensions()); + if(int ret = convert_pressio_data_to_field(&input_copy, &in_field)) { return ret; } @@ -99,7 +100,7 @@ class zfp_plugin: public libpressio_compressor_plugin { return 0; } - int decompress_impl(struct pressio_data* input, struct pressio_data* output) override { + int decompress_impl(const pressio_data *input, struct pressio_data* output) override { size_t size; void* ptr = pressio_data_ptr(input, &size); bitstream* stream = stream_open(ptr, size); diff --git a/src/pressio.cc b/src/pressio.cc index 2265d94..a40aa56 100644 --- a/src/pressio.cc +++ b/src/pressio.cc @@ -12,9 +12,17 @@ namespace { - std::map compressor_constructors{ + std::map()>> + compressor_constructors{ +#if LIBPRESSIO_HAS_SZ std::pair(std::string("sz"), std::function(make_c_sz)), +#endif +#if LIBPRESSIO_HAS_ZFP std::pair(std::string("zfp"), std::function(make_c_zfp)), +#endif +#if LIBPRESSIO_HAS_MGARD + std::pair(std::string("mgard"), std::function(make_c_mgard)), +#endif }; std::map metrics_constructor{ std::pair(std::string("time"), std::function(make_m_time)), diff --git a/src/pressio_compressor.cc b/src/pressio_compressor.cc index 885e05a..eadebdb 100644 --- a/src/pressio_compressor.cc +++ b/src/pressio_compressor.cc @@ -8,10 +8,10 @@ struct pressio_options* pressio_compressor_get_options(struct pressio_compressor int pressio_compressor_set_options(struct pressio_compressor* compressor, struct pressio_options const * options) { return compressor->plugin->set_options(options); } -int pressio_compressor_compress(struct pressio_compressor* compressor, struct pressio_data * input, struct pressio_data * output) { +int pressio_compressor_compress(struct pressio_compressor* compressor, const pressio_data *input, struct pressio_data * output) { return compressor->plugin->compress(input, output); } -int pressio_compressor_decompress(struct pressio_compressor* compressor, struct pressio_data * input, struct pressio_data * output) { +int pressio_compressor_decompress(struct pressio_compressor* compressor, const pressio_data *input, struct pressio_data * output) { return compressor->plugin->decompress(input, output); } const char* pressio_compressor_version(struct pressio_compressor const* compressor) { diff --git a/src/pressio_data.cc b/src/pressio_data.cc index d61a64a..3a73b81 100644 --- a/src/pressio_data.cc +++ b/src/pressio_data.cc @@ -60,7 +60,7 @@ bool pressio_data_has_data(struct pressio_data const* data) { } size_t pressio_data_num_dimensions(struct pressio_data const* data) { - return data->dimensions(); + return data->num_dimensions(); } size_t pressio_data_get_dimension(struct pressio_data const* data, size_t dimension) { diff --git a/src/pressio_option.cc b/src/pressio_option.cc index ab8d820..7ce1647 100644 --- a/src/pressio_option.cc +++ b/src/pressio_option.cc @@ -3,6 +3,17 @@ #include "pressio_option.h" #include "libpressio_ext/cpp/options.h" +template<> +pressio_option::pressio_option(std::monostate value): option(value) {} + +/** Specialization for the std::monostate singleton + * \returns true if the option has no specified type or value + */ +template <> +bool pressio_option::holds_alternative() const { + return std::holds_alternative(option); +} + extern "C" { struct pressio_option* pressio_option_new() { diff --git a/swig/CMakeLists.txt b/swig/CMakeLists.txt index c3bf77d..a8f257c 100644 --- a/swig/CMakeLists.txt +++ b/swig/CMakeLists.txt @@ -1,3 +1,4 @@ +find_package(Python COMPONENTS Interpreter Development NumPy) find_package(SWIG) if(SWIG_FOUND AND PYTHON_FOUND) include(UseSWIG) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 056a940..af3b153 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -36,27 +36,36 @@ endfunction() add_gtest(test_pressio_data.cc) add_gtest(test_pressio_options.cc) -add_gtest(test_sz_plugin.cc) add_gtest(test_io.cc) -target_include_directories(test_sz_plugin PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/../include) -add_executable(sz_basic sz_basic.c make_input_data.cc) -target_link_libraries(sz_basic libpressio) -add_test(sz_basic_test sz_basic) +if(LIBPRESSIO_HAS_SZ) + add_gtest(test_sz_plugin.cc) + target_include_directories(test_sz_plugin PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/../include) -add_executable(zfp_basic zfp_basic.c make_input_data.cc) -target_link_libraries(zfp_basic libpressio) -add_test(zfp_basic_test zfp_basic) + add_executable(sz_basic sz_basic.c make_input_data.cc) + target_link_libraries(sz_basic libpressio) + add_test(sz_basic_test sz_basic) -add_executable(full full.c make_input_data.cc) -target_link_libraries(full libpressio) -add_test(full_test full) + add_executable(metrics metrics.c make_input_data.cc) + target_link_libraries(metrics libpressio) + add_test(metrics_test metrics) +endif() + + +if(LIBPRESSIO_HAS_ZFP) + add_executable(zfp_basic zfp_basic.c make_input_data.cc) + target_link_libraries(zfp_basic libpressio) + add_test(zfp_basic_test zfp_basic) +endif() + +if(LIBPRESSIO_HAS_SZ AND LIBPRESSIO_HAS_ZFP) + add_executable(full full.c make_input_data.cc) + target_link_libraries(full libpressio) + add_test(full_test full) +endif() -add_executable(metrics metrics.c make_input_data.cc) -target_link_libraries(metrics libpressio) -add_test(metrics_test metrics) -if(BUILD_PYTHON_WRAPPER) +if(BUILD_PYTHON_WRAPPER AND LIBPRESSIO_HAS_SZ) add_test(test_python_wrapper ${Python_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_python.py