From 3a1582e88760ac5a16aa8a9a204d820e6bf50f58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Du=C5=A1an=20Poizl?= Date: Thu, 9 Mar 2023 16:47:06 +0100 Subject: [PATCH] Add USE_BUNDLED_LIBS --- CMakeLists.txt | 59 ++++++++++++++-------- bytearray.h | 29 ----------- libxisf.cpp | 8 +-- libxisf.h | 102 ++++++++++++++++++++++++++++++++++++- variant.cpp | 5 +- variant.h | 134 ------------------------------------------------- 6 files changed, 144 insertions(+), 193 deletions(-) delete mode 100644 bytearray.h delete mode 100644 variant.h diff --git a/CMakeLists.txt b/CMakeLists.txt index cd1d4d7..6bc9a2d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,38 +9,53 @@ set(CMAKE_C_VISIBILITY_PRESET hidden) set(CMAKE_CXX_VISIBILITY_PRESET hidden) option(BUILD_SHARED_LIBS "Build using shared libraries" ON) +option(USE_BUNDLED_LIBS "Use bundled LZ4 PugiXML and Zlib" ON) + +if(USE_BUNDLED_LIBS) +set(THIRD_PARTY_SRC + lz4/lz4.c + lz4/lz4.h + lz4/lz4hc.c + lz4/lz4hc.h + pugixml/pugixml.cpp + zlib/adler32.c + zlib/compress.c + zlib/crc32.c + zlib/deflate.c + zlib/gzclose.c + zlib/gzlib.c + zlib/gzread.c + zlib/gzwrite.c + zlib/inflate.c + zlib/infback.c + zlib/inftrees.c + zlib/inffast.c + zlib/trees.c + zlib/uncompr.c + zlib/zutil.c) +else(USE_BUNDLED_LIBS) + find_package(PkgConfig REQUIRED) + pkg_check_modules(LZ4 liblz4 IMPORTED_TARGET REQUIRED) + pkg_check_modules(PUGIXML pugixml IMPORTED_TARGET REQUIRED) + pkg_check_modules(ZLIB zlib IMPORTED_TARGET REQUIRED) +endif(USE_BUNDLED_LIBS) add_library(XISF bytearray.cpp - bytearray.h libXISF_global.h libxisf.cpp libxisf.h utils.cpp variant.cpp - variant.h - lz4/lz4.c - lz4/lz4.h - lz4/lz4hc.c - lz4/lz4hc.h - pugixml/pugixml.cpp - zlib/adler32.c - zlib/compress.c - zlib/crc32.c - zlib/deflate.c - zlib/gzclose.c - zlib/gzlib.c - zlib/gzread.c - zlib/gzwrite.c - zlib/inflate.c - zlib/infback.c - zlib/inftrees.c - zlib/inffast.c - zlib/trees.c - zlib/uncompr.c - zlib/zutil.c + ${THIRD_PARTY_SRC} ) +if(USE_BUNDLED_LIBS) + target_include_directories(XISF PRIVATE lz4 pugixml zlib) +else(USE_BUNDLED_LIBS) + target_link_libraries(XISF PUBLIC PkgConfig::LZ4 PkgConfig::PUGIXML PkgConfig::ZLIB) +endif(USE_BUNDLED_LIBS) + set_target_properties(XISF PROPERTIES VERSION ${PROJECT_VERSION} SOVERSION ${PROJECT_VERSION_MAJOR}) if(BUILD_SHARED_LIBS) diff --git a/bytearray.h b/bytearray.h deleted file mode 100644 index 92bfb50..0000000 --- a/bytearray.h +++ /dev/null @@ -1,29 +0,0 @@ -/************************************************************************ - * LibXISF - library to load and save XISF files * - * Copyright (C) 2023 Dušan Poizl * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see .* - ************************************************************************/ - -#ifndef LIBXISF_BYTEARRAY_H -#define LIBXISF_BYTEARRAY_H - -namespace LibXISF -{ - - - -} - -#endif // LIBXISF_BYTEARRAY_H diff --git a/libxisf.cpp b/libxisf.cpp index d35ef03..660e7f5 100644 --- a/libxisf.cpp +++ b/libxisf.cpp @@ -23,10 +23,10 @@ #include #include #include -#include "lz4/lz4.h" -#include "lz4/lz4hc.h" -#include "pugixml/pugixml.hpp" -#include "zlib/zlib.h" +#include +#include +#include +#include namespace LibXISF { diff --git a/libxisf.h b/libxisf.h index 5dae177..2587299 100644 --- a/libxisf.h +++ b/libxisf.h @@ -25,7 +25,10 @@ #include #include #include -#include "variant.h" +#include +#include +#include +#include namespace LibXISF { @@ -64,6 +67,103 @@ public: void decodeHex(); }; +struct Complex32 +{ + float real; + float imag; +}; + +struct Complex64 +{ + double real; + double imag; +}; + +template +class Matrix +{ + int _rows = 0; + int _cols = 0; + std::vector _elem; +public: + using value_type = T; + + Matrix() = default; + Matrix(int rows, int cols) : _rows(rows), _cols(cols), _elem(rows * cols) {} + void resize(int rows, int cols) { _rows = rows; _cols = cols; _elem.resize(rows * cols); } + T& operator()(int row, int col) { return _elem[row * _cols + col]; } + const T& operator()(int row, int col) const { return _elem[row * _cols + col]; } + int rows() const { return _rows; } + int cols() const { return _cols; } +}; + +typedef bool Boolean; +typedef int8_t Int8; +typedef uint8_t UInt8; +typedef int16_t Int16; +typedef uint16_t UInt16; +typedef int32_t Int32; +typedef uint32_t UInt32; +typedef int64_t Int64; +typedef uint64_t UInt64; +typedef float Float32; +typedef double Float64; +typedef std::string String; +typedef std::tm TimePoint; +typedef std::vector I8Vector; +typedef std::vector UI8Vector; +typedef std::vector I16Vector; +typedef std::vector UI16Vector; +typedef std::vector I32Vector; +typedef std::vector UI32Vector; +typedef std::vector I64Vector; +typedef std::vector UI64Vector; +typedef std::vector F32Vector; +typedef std::vector F64Vector; +typedef std::vector C32Vector; +typedef std::vector C64Vector; +typedef Matrix I8Matrix; +typedef Matrix UI8Matrix; +typedef Matrix I16Matrix; +typedef Matrix UI16Matrix; +typedef Matrix I32Matrix; +typedef Matrix UI32Matrix; +typedef Matrix I64Matrix; +typedef Matrix UI64Matrix; +typedef Matrix F32Matrix; +typedef Matrix F64Matrix; +typedef Matrix C32Matrix; +typedef Matrix C64Matrix; + +class Variant +{ + using StdVariant = std::variant; + StdVariant _value; +public: + enum class Type + { + Monostate, Boolean, Int8, UInt8, Int16, UInt16, Int32, UInt32, Int64, UInt64, Float32, Float64, + Complex32, Complex64, String, TimePoint, + I8Vector, UI8Vector, I16Vector, UI16Vector, I32Vector, UI32Vector, I64Vector, UI64Vector, F32Vector, F64Vector, C32Vector, C64Vector, + I8Matrix, UI8Matrix, I16Matrix, UI16Matrix, I32Matrix, UI32Matrix, I64Matrix, UI64Matrix, F32Matrix, F64Matrix, C32Matrix, C64Matrix + }; + + Variant() = default; + template + Variant(const T &t) : _value(t) {} + Type type() const; + const char *typeName() const; + template + T& value() { return std::get(_value); } + template + const T& value() const { return std::get(_value); } + template + void setValue(const T& val) { _value = val; } +}; + struct LIBXISF_EXPORT DataBlock { enum CompressionCodec diff --git a/variant.cpp b/variant.cpp index 9a3b967..215abbb 100644 --- a/variant.cpp +++ b/variant.cpp @@ -16,7 +16,6 @@ * along with this program. If not, see .* ************************************************************************/ -#include "variant.h" #include #include #include @@ -336,7 +335,7 @@ void serializeVariant(pugi::xml_node &node, const Variant &variant) } node.append_attribute("length").set_value(len); node.append_attribute("location").set_value("inline:base64"); - node.append_child(pugi::node_pcdata).set_value(data.constData(), data.size()); + node.append_child(pugi::node_pcdata).set_value(data.constData()); } else if(variant.type() >= Variant::Type::I8Matrix && variant.type() <= Variant::Type::C64Matrix) { @@ -363,7 +362,7 @@ void serializeVariant(pugi::xml_node &node, const Variant &variant) node.append_attribute("rows").set_value(rows); node.append_attribute("columns").set_value(cols); node.append_attribute("location").set_value("inline:base64"); - node.append_child(pugi::node_pcdata).set_value(data.constData(), data.size()); + node.append_child(pugi::node_pcdata).set_value(data.constData()); } else if(variant.type() == Variant::Type::TimePoint) { diff --git a/variant.h b/variant.h deleted file mode 100644 index 19993fd..0000000 --- a/variant.h +++ /dev/null @@ -1,134 +0,0 @@ -/************************************************************************ - * LibXISF - library to load and save XISF files * - * Copyright (C) 2023 Dušan Poizl * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see .* - ************************************************************************/ - -#ifndef LIBXISF_VARIANT_H -#define LIBXISF_VARIANT_H - -#include -#include -#include -#include -#include -#include -#include -#include -#include "libXISF_global.h" - -namespace LibXISF -{ - -struct Complex32 -{ - float real; - float imag; -}; - -struct Complex64 -{ - double real; - double imag; -}; - -template -class Matrix -{ - int _rows = 0; - int _cols = 0; - std::vector _elem; -public: - using value_type = T; - - Matrix() = default; - Matrix(int rows, int cols) : _rows(rows), _cols(cols), _elem(rows * cols) {} - void resize(int rows, int cols) { _rows = rows; _cols = cols; _elem.resize(rows * cols); } - T& operator()(int row, int col) { return _elem[row * _cols + col]; } - const T& operator()(int row, int col) const { return _elem[row * _cols + col]; } - int rows() const { return _rows; } - int cols() const { return _cols; } -}; - -typedef bool Boolean; -typedef int8_t Int8; -typedef uint8_t UInt8; -typedef int16_t Int16; -typedef uint16_t UInt16; -typedef int32_t Int32; -typedef uint32_t UInt32; -typedef int64_t Int64; -typedef uint64_t UInt64; -typedef float Float32; -typedef double Float64; -typedef std::string String; -typedef std::tm TimePoint; -typedef std::vector I8Vector; -typedef std::vector UI8Vector; -typedef std::vector I16Vector; -typedef std::vector UI16Vector; -typedef std::vector I32Vector; -typedef std::vector UI32Vector; -typedef std::vector I64Vector; -typedef std::vector UI64Vector; -typedef std::vector F32Vector; -typedef std::vector F64Vector; -typedef std::vector C32Vector; -typedef std::vector C64Vector; -typedef Matrix I8Matrix; -typedef Matrix UI8Matrix; -typedef Matrix I16Matrix; -typedef Matrix UI16Matrix; -typedef Matrix I32Matrix; -typedef Matrix UI32Matrix; -typedef Matrix I64Matrix; -typedef Matrix UI64Matrix; -typedef Matrix F32Matrix; -typedef Matrix F64Matrix; -typedef Matrix C32Matrix; -typedef Matrix C64Matrix; - -class Variant -{ - using StdVariant = std::variant; - StdVariant _value; -public: - enum class Type - { - Monostate, Boolean, Int8, UInt8, Int16, UInt16, Int32, UInt32, Int64, UInt64, Float32, Float64, - Complex32, Complex64, String, TimePoint, - I8Vector, UI8Vector, I16Vector, UI16Vector, I32Vector, UI32Vector, I64Vector, UI64Vector, F32Vector, F64Vector, C32Vector, C64Vector, - I8Matrix, UI8Matrix, I16Matrix, UI16Matrix, I32Matrix, UI32Matrix, I64Matrix, UI64Matrix, F32Matrix, F64Matrix, C32Matrix, C64Matrix - }; - - Variant() = default; - template - Variant(const T &t) : _value(t) {} - Type type() const; - const char *typeName() const; - template - T& value() { return std::get(_value); } - template - const T& value() const { return std::get(_value); } - template - void setValue(const T& val) { _value = val; } -}; - -} - -#endif // LIBXISF_VARIANT_H