/************************************************************************ * 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