From b2c52384b0654a593d854665de23e8322c7ac9c4 Mon Sep 17 00:00:00 2001 From: Christian Zimmermann Date: Sat, 3 Feb 2024 01:22:52 +0100 Subject: [PATCH 1/9] README: expressions and operations section (WIP) --- README.md | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/README.md b/README.md index 19c0247..3cfb608 100644 --- a/README.md +++ b/README.md @@ -72,5 +72,75 @@ Finally, there are the container classes (arrays), which are derived from `CArra #### Expressions and Operations +In the context of this library, *expressions* are classes representing an expression that is supposed to be executed at given points during an iteration proceedure that involves one or more indexed quantities. Each expression type must fulfill the following requirements: + +* There must be an implementation of `operator()` taking a multi-position argument indicating the position for the current iteration of each involved object according to its indices. The function can have an expression defined return value, which can be further processed. + +* There must be an implementation of `rootSteps()` taking an index ID as argument. The function should return jump sizes for each involved object corresponding to the given index. + +Each expression `Xpr` should be derived from the class `XprInterface`, where `Xpr` is a recurring template argument (static polymorphism). + +There are two important expression types: + +* *For* expressions: They represent a for loop over a given index. + +* *Operations*: They correspond to one or more indexed array types and given operation on or between them. If an operation handles nothing but the access to one single array, it is called *Operation* *Root*. + +Example: +```cpp +#include "cnroxz.h" + +using namespace CNORZX; + +RangePtr r = CRangeFactory(3).create(); // [0,1,2] +RangePtr s = CRangeFactory(5).create(); // [0,1,2,3,4] +RangePtr t = URangeFactory(Vector{4,5,6}).create(); // [4,5,6] +i = std::make_shared(r); +j = std::make_shared(s); +k = std::make_shared>(t); + +MArray a(r*s*t); // 3-dim array, dimensions = [3,5,3], size = 45 +MArray b(r*t); // 2-dim array, dimensions = [3,3], size = 9 +MArray c(s*t); // 2-dim array, dimensions = [3,5], size = 15 + +// set array element values of a,b,c here... + +c(j*k) += ( a(i*j*k) * b(j*k) * xpr(k) ).c(i); + +/* Explanation of the above line: + +c(j*k), a(i*j*k), b(j*k) and xpr(k) are operation roots, i.e. +they manage access to the arrays c,a,b and the meta data space of index k + +The operations between the operation roots are also operations in the +sense of this nomenclature, i.e. a(i*j*k) * b(j*k) is again an operation. + +The operation member function c() creates contraction, i.e. a for loop +over the given index (i). If no further functions are specified, the values +returned by the underlying operations are summed up for equivalent index +combinations. + +The += invokes a for loop over the indices on the l.h.s.. The values returned +by the expression on the r.h.s. are added to the l.h.s. Something similar could be done +with a = operator. Then the values would just be assigned instead of added. + +*/ + +// Equivalent C-stype for loop (if a,b,c were C-style arrays): + +for(size_t j = 0; j < s; ++j){ + for(size_t k = 0; k < t; ++k){ + int kv = k+4; + double x = 0; + // the contraction part: + for(size_t i = 0; i < r; ++i){ + x += a[i*s*t+j*t+k] * b[j*t+k] * kv; + } + c[j*t+k] += x; + } +} + +``` + ... From 871910355d36032dce0e39c4f5a72fd84e967a0c Mon Sep 17 00:00:00 2001 From: Christian Zimmermann Date: Sat, 3 Feb 2024 16:44:34 +0100 Subject: [PATCH 2/9] cereal documentation --- src/include/memory/allocator.cc.h | 10 ++ src/include/memory/allocator.h | 7 +- src/include/operation/basic_operations.cc.h | 10 ++ src/include/operation/basic_operations.h | 10 ++ src/opt/cereal/include/cer_array.cc.h | 11 +- src/opt/cereal/include/cer_base.h | 18 ++- src/opt/cereal/include/cer_header.cc.h | 10 ++ src/opt/cereal/include/cer_header.h | 34 +++++- src/opt/cereal/include/cer_ranges.cc.h | 10 ++ src/opt/cereal/include/cer_type_register.cc.h | 10 ++ src/opt/cereal/include/cnorxz_cereal.h | 10 ++ src/opt/cereal/include/range_save_load.cc.h | 10 ++ src/opt/cereal/include/range_save_load.h | 20 +++- src/opt/cereal/include/utilities.cc.h | 10 ++ src/opt/cereal/include/utilities.h | 109 +++++++++++++++--- src/opt/hdf5/lib/h5_group.cc | 2 + src/tests/test_numbers.h | 2 + 17 files changed, 268 insertions(+), 25 deletions(-) diff --git a/src/include/memory/allocator.cc.h b/src/include/memory/allocator.cc.h index 352eb9c..2e50105 100644 --- a/src/include/memory/allocator.cc.h +++ b/src/include/memory/allocator.cc.h @@ -1,3 +1,13 @@ +// -*- C++ -*- +/** + + @file include/memory/allocator.cc.h + @brief Allocator template member function implementation + + Copyright (c) 2024 Christian Zimmermann. All rights reserved. + Mail: chizeta@f3l.de + +**/ #ifndef __cxz_allocator_cc_h__ #define __cxz_allocator_cc_h__ diff --git a/src/include/memory/allocator.h b/src/include/memory/allocator.h index 92be7f3..bc90139 100644 --- a/src/include/memory/allocator.h +++ b/src/include/memory/allocator.h @@ -1,11 +1,10 @@ // -*- C++ -*- /** - @file include/memory/memcount.h - @brief ... + @file include/memory/allocator.h + @brief Allocator declaration - - Copyright (c) 2022 Christian Zimmermann. All rights reserved. + Copyright (c) 2024 Christian Zimmermann. All rights reserved. Mail: chizeta@f3l.de **/ diff --git a/src/include/operation/basic_operations.cc.h b/src/include/operation/basic_operations.cc.h index 9e8d3b5..df23e01 100644 --- a/src/include/operation/basic_operations.cc.h +++ b/src/include/operation/basic_operations.cc.h @@ -1,3 +1,13 @@ +// -*- C++ -*- +/** + + @file include/operation/basic_operations.cc.h + @brief Basic operations implementation + + Copyright (c) 2024 Christian Zimmermann. All rights reserved. + Mail: chizeta@f3l.de + + **/ #ifndef __cxz_basic_operations_cc_h__ #define __cxz_basic_operations_cc_h__ diff --git a/src/include/operation/basic_operations.h b/src/include/operation/basic_operations.h index 150e183..8301fbe 100644 --- a/src/include/operation/basic_operations.h +++ b/src/include/operation/basic_operations.h @@ -1,3 +1,13 @@ +// -*- C++ -*- +/** + + @file include/operation/basic_operations.h + @brief Basic operations declaration + + Copyright (c) 2024 Christian Zimmermann. All rights reserved. + Mail: chizeta@f3l.de + + **/ #ifndef __cxz_basic_operations_h__ #define __cxz_basic_operations_h__ diff --git a/src/opt/cereal/include/cer_array.cc.h b/src/opt/cereal/include/cer_array.cc.h index 35f5c6d..076c658 100644 --- a/src/opt/cereal/include/cer_array.cc.h +++ b/src/opt/cereal/include/cer_array.cc.h @@ -1,3 +1,13 @@ +// -*- C++ -*- +/** + + @file opt/cereal/include/cer_array.cc.h + @brief Load and save implementation for MArray. + + Copyright (c) 2024 Christian Zimmermann. All rights reserved. + Mail: chizeta@f3l.de + + **/ #ifndef __cxz_cereal_array_cc_h__ #define __cxz_cereal_array_cc_h__ @@ -23,7 +33,6 @@ namespace CNORXZ { CXZ_ASSERT(version == 1u, "format version = " << version << " not supported"); cer::save_load(ar, "range", AB::mRange); - //ar(cereal::make_nvp("range", AB::mRange)); ar(cereal::make_nvp("data", mCont)); } } diff --git a/src/opt/cereal/include/cer_base.h b/src/opt/cereal/include/cer_base.h index 97710f9..127de76 100644 --- a/src/opt/cereal/include/cer_base.h +++ b/src/opt/cereal/include/cer_base.h @@ -1,19 +1,35 @@ +// -*- C++ -*- +/** + + @file opt/cereal/include/cer_base.h + @brief CNORXZ Cereal basic types declaration. + + Copyright (c) 2024 Christian Zimmermann. All rights reserved. + Mail: chizeta@f3l.de + + **/ #ifndef __cxz_cer_base_h__ #define __cxz_cer_base_h__ -#define CXZ_CEREAL_FORMAT_VERION 1u +#define CXZ_CEREAL_FORMAT_VERION 1u /**< CNORXZ specific cereal format version. */ namespace CNORXZ { namespace cer { + /** **** + Archive format enum class. + */ enum class Format { BINARY = 1u, JSON = 2u, XML = 3u }; + /** **** + Content type enum class. + */ enum class ContentType { ARRAY = 1u, MAP = 2u diff --git a/src/opt/cereal/include/cer_header.cc.h b/src/opt/cereal/include/cer_header.cc.h index 64dcd2a..408cfd9 100644 --- a/src/opt/cereal/include/cer_header.cc.h +++ b/src/opt/cereal/include/cer_header.cc.h @@ -1,3 +1,13 @@ +// -*- C++ -*- +/** + + @file opt/cereal/include/cer_header.cc.h + @brief Load and save implementation for CNORXZ cereal data header. + + Copyright (c) 2024 Christian Zimmermann. All rights reserved. + Mail: chizeta@f3l.de + + **/ #ifndef __cxz_cereal_header_cc_h__ #define __cxz_cereal_header_cc_h__ diff --git a/src/opt/cereal/include/cer_header.h b/src/opt/cereal/include/cer_header.h index be677a1..946c2a8 100644 --- a/src/opt/cereal/include/cer_header.h +++ b/src/opt/cereal/include/cer_header.h @@ -1,3 +1,13 @@ +// -*- C++ -*- +/** + + @file opt/cereal/include/cer_header.h + @brief CNORXZ Cereal data header declaration. + + Copyright (c) 2024 Christian Zimmermann. All rights reserved. + Mail: chizeta@f3l.de + + **/ #ifndef __cxz_cereal_header_h__ #define __cxz_cereal_header_h__ @@ -9,13 +19,19 @@ namespace CNORXZ { namespace cer { + /** **** + Cereal data header struct. + */ struct Header { - String version; - String commit; - ContentType content; + String version; /**< CNORXZ version. */ + String commit; /**< CNORXZ git commit. */ + ContentType content; /**< Content type. */ }; + /** Create header. + @param content Content type. + */ inline Header mkHeader(const ContentType content) { Header o; @@ -24,10 +40,20 @@ namespace CNORXZ o.content = content; return o; } - + + /** Serialze header, store in archive. + @param ar Target archive. + @param h Input header. + @param version Version. + */ template void save(Archive& ar, const Header& h, const std::uint32_t version); + /** Deserialze header from archive. + @param ar Source archive. + @param h Target header reference. + @param version Version. + */ template void load(Archive& ar, Header& h, const std::uint32_t version); diff --git a/src/opt/cereal/include/cer_ranges.cc.h b/src/opt/cereal/include/cer_ranges.cc.h index ea2748e..7180e99 100644 --- a/src/opt/cereal/include/cer_ranges.cc.h +++ b/src/opt/cereal/include/cer_ranges.cc.h @@ -1,3 +1,13 @@ +// -*- C++ -*- +/** + + @file opt/cereal/include/cer_ranges.cc.h + @brief Load and save implementation for cnorxz ranges. + + Copyright (c) 2024 Christian Zimmermann. All rights reserved. + Mail: chizeta@f3l.de + + **/ #ifndef __cxz_cereal_ranges_cc_h__ #define __cxz_cereal_ranges_cc_h__ diff --git a/src/opt/cereal/include/cer_type_register.cc.h b/src/opt/cereal/include/cer_type_register.cc.h index 7e4ae5c..4c3ba4f 100644 --- a/src/opt/cereal/include/cer_type_register.cc.h +++ b/src/opt/cereal/include/cer_type_register.cc.h @@ -1,3 +1,13 @@ +// -*- C++ -*- +/** + + @file opt/cereal/include/cer_type_register.cc.h + @brief Register CNORXZ cereal types. + + Copyright (c) 2024 Christian Zimmermann. All rights reserved. + Mail: chizeta@f3l.de + + **/ #ifndef __cxz_cereal_type_register_cc_h__ #define __cxz_cereal_type_register_cc_h__ diff --git a/src/opt/cereal/include/cnorxz_cereal.h b/src/opt/cereal/include/cnorxz_cereal.h index 5d58780..d7410c2 100644 --- a/src/opt/cereal/include/cnorxz_cereal.h +++ b/src/opt/cereal/include/cnorxz_cereal.h @@ -1,3 +1,13 @@ +// -*- C++ -*- +/** + + @file opt/cereal/include/cnorxz_cereal.h + @brief CNORXZ Cereal main header + + Copyright (c) 2024 Christian Zimmermann. All rights reserved. + Mail: chizeta@f3l.de + + **/ #include "cer_base.h" #include "cer_header.h" diff --git a/src/opt/cereal/include/range_save_load.cc.h b/src/opt/cereal/include/range_save_load.cc.h index db6917c..e568257 100644 --- a/src/opt/cereal/include/range_save_load.cc.h +++ b/src/opt/cereal/include/range_save_load.cc.h @@ -1,3 +1,13 @@ +// -*- C++ -*- +/** + + @file opt/cereal/include/range_save_load.cc.h + @brief CNORXZ Cereal range save load implementation. + + Copyright (c) 2024 Christian Zimmermann. All rights reserved. + Mail: chizeta@f3l.de + + **/ #ifndef __range_save_load_cc_h__ #define __range_save_load_cc_h__ diff --git a/src/opt/cereal/include/range_save_load.h b/src/opt/cereal/include/range_save_load.h index a60f0f6..5ef60bc 100644 --- a/src/opt/cereal/include/range_save_load.h +++ b/src/opt/cereal/include/range_save_load.h @@ -1,3 +1,13 @@ +// -*- C++ -*- +/** + + @file opt/cereal/include/range_save_load.h + @brief CNORXZ Cereal range save load declaration. + + Copyright (c) 2024 Christian Zimmermann. All rights reserved. + Mail: chizeta@f3l.de + + **/ #ifndef __range_save_load_h__ #define __range_save_load_h__ @@ -8,8 +18,14 @@ namespace CNORXZ { namespace cer { - // use this function to register the range in the map of the range factories - // (otherwise there might be more than one instance of the same range) + /** Deserialize and register range from cereal archive. + Always use this function to load ranges from archives so that it is + registered in the map of the range factories. Otherwise there might be more + than one instance of the same range. + @param ar Archive to read from. + @param name Archive key. + @param r Target range pointer. + */ template RangePtr save_load(Archive& ar, const String& name, RangePtr& r); } diff --git a/src/opt/cereal/include/utilities.cc.h b/src/opt/cereal/include/utilities.cc.h index 790d3ae..678231d 100644 --- a/src/opt/cereal/include/utilities.cc.h +++ b/src/opt/cereal/include/utilities.cc.h @@ -1,3 +1,13 @@ +// -*- C++ -*- +/** + + @file opt/cereal/include/utilities.cc.h + @brief CNORXZ Cereal utilities implementation. + + Copyright (c) 2024 Christian Zimmermann. All rights reserved. + Mail: chizeta@f3l.de + + **/ #ifndef __cxz_cereal_utilities_cc_h__ #define __cxz_cereal_utilities_cc_h__ diff --git a/src/opt/cereal/include/utilities.h b/src/opt/cereal/include/utilities.h index e8e8750..6a7a0bf 100644 --- a/src/opt/cereal/include/utilities.h +++ b/src/opt/cereal/include/utilities.h @@ -1,3 +1,13 @@ +// -*- C++ -*- +/** + + @file opt/cereal/include/utilities.h + @brief CNORXZ Cereal utilities declaration. + + Copyright (c) 2024 Christian Zimmermann. All rights reserved. + Mail: chizeta@f3l.de + + **/ #ifndef __cxz_cereal_utilities_h__ #define __cxz_cereal_utilities_h__ @@ -14,68 +24,141 @@ namespace CNORXZ { namespace cer { - + /** **** + Output archive type trait. + @tparam F Format enum. + */ template struct OutputFormatMap {}; + /** Output archive for binary format. */ template <> struct OutputFormatMap - { typedef cereal::BinaryOutputArchive type; }; + { typedef cereal::BinaryOutputArchive type; /**< archive type. */ }; + /** Output archive for json format. */ template <> struct OutputFormatMap - { typedef cereal::JSONOutputArchive type; }; + { typedef cereal::JSONOutputArchive type; /**< archive type. */ }; + /** Output archive for xml format. */ template <> struct OutputFormatMap - { typedef cereal::XMLOutputArchive type; }; + { typedef cereal::XMLOutputArchive type; /**< archive type. */ }; + /** **** + Input archive type trait. + @tparam F Format enum. + */ template struct InputFormatMap {}; + /** Input archive for binary format. */ template <> struct InputFormatMap - { typedef cereal::BinaryInputArchive type; }; + { typedef cereal::BinaryInputArchive type; /**< archive type. */ }; + /** Input archive for json format. */ template <> struct InputFormatMap - { typedef cereal::JSONInputArchive type; }; + { typedef cereal::JSONInputArchive type; /**< archive type. */ }; + /** Input archive for xml format. */ template <> struct InputFormatMap - { typedef cereal::XMLInputArchive type; }; + { typedef cereal::XMLInputArchive type; /**< archive type. */ }; + /** Serialize MArray to stream + @tparam F Format enum class [BINARY,JSON,XML]. + @tparam T Array element value type. + @param os Output stream. + @param data Array to be serialized. + */ template void write(std::ostream& os, const MArray& data); + /** Deserialize MArray from stream + @tparam F Format enum class [BINARY,JSON,XML]. + @tparam T Array element value type. + @param is Input stream. + @param data Target array. + */ template void read(std::istream& is, MArray& data); + /** Serialize MArray and write to file. + @tparam F Format enum class [BINARY,JSON,XML]. + @tparam T Array element value type. + @param name File name. + @param data Array to be saved. + */ template void writeFile(const String& name, const MArray& data); + /** Read and deserialize MArray from cereal compatibel file. + @tparam F Format enum class [BINARY,JSON,XML]. + @tparam T Array element value type. + @param name File name. + @param data target array. + */ template void readFile(const String& name, MArray& data); + /** Serialize MArray and write to binary file. + @tparam T Array element value type. + @param name File name. + @param data Array to be saved. + */ template - void writeBINARYFile(const String& name, const MArray& data) { writeFile(name, data); } + inline void writeBINARYFile(const String& name, const MArray& data) + { writeFile(name, data); } + /** Read and deserialize MArray from cereal compatibel binary file. + @tparam T Array element value type. + @param name File name. + @param data target array. + */ template - void readBINARYFile(const String& name, MArray& data) { readFile(name, data); } + inline void readBINARYFile(const String& name, MArray& data) + { readFile(name, data); } + /** Serialize MArray and write to json file. + @tparam T Array element value type. + @param name File name. + @param data Array to be saved. + */ template - void writeJSONFile(const String& name, const MArray& data) { writeFile(name, data); } + inline void writeJSONFile(const String& name, const MArray& data) + { writeFile(name, data); } + /** Read and deserialize MArray from cereal compatibel json file. + @tparam T Array element value type. + @param name File name. + @param data target array. + */ template - void readJSONFile(const String& name, MArray& data) { readFile(name, data); } + inline void readJSONFile(const String& name, MArray& data) + { readFile(name, data); } + /** Serialize MArray and write to xml file. + @tparam T Array element value type. + @param name File name. + @param data Array to be saved. + */ template - void writeXMLFile(const String& name, const MArray& data) { writeFile(name, data); } + inline void writeXMLFile(const String& name, const MArray& data) + { writeFile(name, data); } + /** Read and deserialize MArray from cereal compatibel xml file. + @tparam T Array element value type. + @param name File name. + @param data target array. + */ template - void readXMLFile(const String& name, MArray& data) { readFile(name, data); } + inline void readXMLFile(const String& name, MArray& data) + { readFile(name, data); } } } diff --git a/src/opt/hdf5/lib/h5_group.cc b/src/opt/hdf5/lib/h5_group.cc index 7728b95..a5d093f 100644 --- a/src/opt/hdf5/lib/h5_group.cc +++ b/src/opt/hdf5/lib/h5_group.cc @@ -133,11 +133,13 @@ namespace CNORXZ return *this; } + /** @cond 0 */ struct InitContData { const ContentBase* parent; BIndex index; }; + /** @endcond */ static herr_t addName(hid_t id, const char* name, const H5L_info_t* info, void* x) { diff --git a/src/tests/test_numbers.h b/src/tests/test_numbers.h index 2a66357..0d4e52a 100644 --- a/src/tests/test_numbers.h +++ b/src/tests/test_numbers.h @@ -11,6 +11,7 @@ namespace CNORXZ { namespace Test { + /** @cond 0 */ class Numbers { private: @@ -51,6 +52,7 @@ namespace CNORXZ return Vector(b,e); } }; + /** @endcond */ } } From 5eff4cfe3fda99795c0e64b43fb949c6df627061 Mon Sep 17 00:00:00 2001 From: Christian Zimmermann Date: Sat, 3 Feb 2024 18:35:13 +0100 Subject: [PATCH 3/9] improve doxygen setup --- README.md | 4 +++- doc/doxy/Doxyfile | 12 +++++------ doc/doxy/cnorxz_logo_mini.png | Bin 0 -> 5562 bytes doc/doxy/header.html | 36 ++++++++++++++++++++++++++++++++ src/include/ranges/index_base.h | 2 +- 5 files changed, 46 insertions(+), 8 deletions(-) create mode 100644 doc/doxy/cnorxz_logo_mini.png create mode 100644 doc/doxy/header.html diff --git a/README.md b/README.md index 3cfb608..3ff29bd 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,6 @@ -# Container with Native Operation Routines by XZ (CNORXZ) +# Container with Native Operation Routines and Expressions (CNORXZ) + +(as always, the name was there before the acronym) ![Image](./cnorxz_logo.png) diff --git a/doc/doxy/Doxyfile b/doc/doxy/Doxyfile index d54e1f3..38e3958 100644 --- a/doc/doxy/Doxyfile +++ b/doc/doxy/Doxyfile @@ -54,14 +54,14 @@ PROJECT_NUMBER = # for a project that appears at the top of each page and should give viewer a # quick idea about the purpose of the project. Keep the description short. -PROJECT_BRIEF = "Container with Native Operation Routines (by XZ)" +PROJECT_BRIEF = "Container with Native Operation Routines and Expressions" # With the PROJECT_LOGO tag one can specify a logo or an icon that is included # in the documentation. The maximum height of the logo should not exceed 55 # pixels and the maximum width should not exceed 200 pixels. Doxygen will copy # the logo to the output directory. -PROJECT_LOGO = +PROJECT_LOGO = "cnorxz_logo_mini.png" # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path # into which the generated documentation will be written. If a relative path is @@ -518,7 +518,7 @@ TIMESTAMP = NO # normally produced when WARNINGS is set to YES. # The default value is: NO. -EXTRACT_ALL = NO +EXTRACT_ALL = YES # If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will # be included in the documentation. @@ -542,7 +542,7 @@ EXTRACT_PACKAGE = NO # included in the documentation. # The default value is: NO. -EXTRACT_STATIC = NO +EXTRACT_STATIC = YES # If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined # locally in source files will be included in the documentation. If set to NO, @@ -1269,7 +1269,7 @@ HTML_FILE_EXTENSION = .html # of the possible markers and block names see the documentation. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_HEADER = +HTML_HEADER = "header.html" # The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each # generated HTML page. If the tag is left blank doxygen will generate a standard @@ -1319,7 +1319,7 @@ HTML_EXTRA_STYLESHEET = # files will be copied as-is; there are no commands or markers available. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_EXTRA_FILES = +HTML_EXTRA_FILES = "cnorxz_logo_mini.png" # The HTML_COLORSTYLE tag can be used to specify if the generated HTML output # should be rendered with a dark or light theme. diff --git a/doc/doxy/cnorxz_logo_mini.png b/doc/doxy/cnorxz_logo_mini.png new file mode 100644 index 0000000000000000000000000000000000000000..9c974fed5d26b8796ecba50a9a5f682907382f50 GIT binary patch literal 5562 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 + + + + + + +CNORXZ: Container with Native Operation Routines and Expressions (CNORXZ) + + + + + + + + + + + + +
+
+ + + + + + + +
+
CNORXZ +
+
Container with Native Operation Routines and Expressions
+
+
+ diff --git a/src/include/ranges/index_base.h b/src/include/ranges/index_base.h index e13b027..4668af8 100644 --- a/src/include/ranges/index_base.h +++ b/src/include/ranges/index_base.h @@ -28,7 +28,7 @@ namespace CNORXZ all indices are supposed to be derived from the corresponding template instance - Indices are act as iterators over parameter spaces (ranges) and/or + Indices act as iterators over parameter spaces (ranges) and/or the containers (arrays) defined on them Moreover, indices are used to define operations on the From c478bf0fae39f9233d61607a0951e2cf7cdf9cbb Mon Sep 17 00:00:00 2001 From: Christian Zimmermann Date: Sat, 3 Feb 2024 22:02:01 +0100 Subject: [PATCH 4/9] more documentation + clean up --- src/bin/config.cc | 10 + src/include/array/array.cc.h | 5 +- src/include/array/array.h | 5 +- src/include/base/config.h | 6 +- src/include/base/to_string.h | 4 +- src/include/base/uuid.h | 2 +- src/include/cnorxz.cc.h | 10 + src/include/operation/extensions/avx.cc.h | 10 + src/include/operation/extensions/avx.h | 10 + .../operation/extensions/extensions.cc.h | 10 + src/include/operation/extensions/extensions.h | 10 + src/include/operation/extensions/reg.cc.h | 10 + src/include/operation/extensions/reg.h | 10 + src/include/operation/op_types.cc.h | 11 +- src/include/operation/op_types.h | 9 + src/include/operation/op_utility.cc.h | 11 +- src/include/operation/op_utility.h | 10 + src/include/operation/operation.cc.h | 10 + src/include/operation/operation.h | 10 + src/include/ranges/dindex.h | 2 +- src/include/ranges/index_format.h | 3 +- src/include/ranges/index_pack.h | 4 +- src/include/ranges/range_base.h | 4 +- src/include/xpr/buf_xpr.cc.h | 10 + src/include/xpr/buf_xpr.h | 10 + src/include/xpr/for.cc.h | 10 + src/include/xpr/for.h | 10 + src/include/xpr/func.cc.h | 10 + src/include/xpr/func.h | 10 + src/include/xpr/index_id.cc.h | 10 + src/include/xpr/index_id.h | 10 + src/include/xpr/pos_type.cc.h | 10 + src/include/xpr/pos_type.h | 10 + src/include/xpr/vpos_type.cc.h | 10 + src/include/xpr/vpos_type.h | 10 + src/include/xpr/xpr.cc.h | 10 + src/include/xpr/xpr.h | 10 + src/include/xpr/xpr_base.cc.h | 10 + src/include/xpr/xpr_base.h | 10 + src/lib/base/config.cc | 12 + src/lib/base/to_string.cc | 12 + src/lib/base/uuid.cc | 10 + src/lib/memory/memcount.cc | 5 +- src/lib/ranges/crange.cc | 10 + src/lib/ranges/dindex.cc | 10 + src/lib/ranges/index_format.cc | 10 + src/lib/ranges/index_pack.cc | 10 + src/lib/ranges/range_base.cc | 10 + src/lib/ranges/yrange.cc | 10 + src/opt/cereal/tests/cereal_unit_test.cc | 10 + src/opt/hdf5/include/h5_type_id.cc.h | 2 +- src/opt/hdf5/include/h5_types.h | 2 +- src/opt/hdf5/lib/h5_dataset.cc | 10 + src/opt/hdf5/lib/h5_file.cc | 10 + src/opt/hdf5/lib/h5_group.cc | 10 + src/opt/hdf5/lib/h5_table.cc | 10 + src/opt/hdf5/tests/h5_basic_unit_test.cc | 10 + src/tests/index_format_test.cc | 11 +- src/tests/marray_unit_test.cc | 9 + src/tests/op_perf_test.cc | 304 ------------------ src/tests/operation_unit_test.cc | 10 + src/tests/range_unit_test.cc | 11 +- src/tests/test_numbers.cc | 12 + src/tests/test_numbers.h | 12 +- src/tests/xpr_unit_test.cc | 10 + 65 files changed, 544 insertions(+), 334 deletions(-) delete mode 100644 src/tests/op_perf_test.cc diff --git a/src/bin/config.cc b/src/bin/config.cc index ad18459..7cf47bd 100644 --- a/src/bin/config.cc +++ b/src/bin/config.cc @@ -1,3 +1,13 @@ +// -*- C++ -*- +/** + + @file bin/config.cc + @brief Program for printing cnorxz configurations. + + Copyright (c) 2024 Christian Zimmermann. All rights reserved. + Mail: chizeta@f3l.de + +**/ #include #include diff --git a/src/include/array/array.cc.h b/src/include/array/array.cc.h index 1a90b0b..69566f7 100644 --- a/src/include/array/array.cc.h +++ b/src/include/array/array.cc.h @@ -2,10 +2,9 @@ /** @file include/array/array.cc.h - @brief ... + @brief Array main header for template implementations. - - Copyright (c) 2022 Christian Zimmermann. All rights reserved. + Copyright (c) 2024 Christian Zimmermann. All rights reserved. Mail: chizeta@f3l.de **/ diff --git a/src/include/array/array.h b/src/include/array/array.h index d1a7358..4d7c23a 100644 --- a/src/include/array/array.h +++ b/src/include/array/array.h @@ -2,10 +2,9 @@ /** @file include/array/array.h - @brief ... + @brief Array main header. - - Copyright (c) 2022 Christian Zimmermann. All rights reserved. + Copyright (c) 2024 Christian Zimmermann. All rights reserved. Mail: chizeta@f3l.de **/ diff --git a/src/include/base/config.h b/src/include/base/config.h index a4224e8..63a9871 100644 --- a/src/include/base/config.h +++ b/src/include/base/config.h @@ -2,11 +2,11 @@ /** @file include/base/config.h - @brief runtime config functions + @brief Runtime config functions declarations. - Declare functions returning version and configuration infos + Declare functions returning version and configuration infos. - Copyright (c) 2022 Christian Zimmermann. All rights reserved. + Copyright (c) 2024 Christian Zimmermann. All rights reserved. Mail: chizeta@f3l.de **/ diff --git a/src/include/base/to_string.h b/src/include/base/to_string.h index 1b00959..96c368a 100644 --- a/src/include/base/to_string.h +++ b/src/include/base/to_string.h @@ -2,9 +2,9 @@ /** @file include/base/to_string.h - @brief String converter + @brief String converter declarations. - Declaration of functions that convert a given object/type to a string + Declaration of functions that convert a given object/type to a string. Copyright (c) 2022 Christian Zimmermann. All rights reserved. Mail: chizeta@f3l.de diff --git a/src/include/base/uuid.h b/src/include/base/uuid.h index df8da17..6bca169 100644 --- a/src/include/base/uuid.h +++ b/src/include/base/uuid.h @@ -2,7 +2,7 @@ /** @file include/base/uuid.h - @brief uuid implementation + @brief cnorxz uuid declaration. Copyright (c) 2022 Christian Zimmermann. All rights reserved. Mail: chizeta@f3l.de diff --git a/src/include/cnorxz.cc.h b/src/include/cnorxz.cc.h index 46e5a5c..fdafce4 100644 --- a/src/include/cnorxz.cc.h +++ b/src/include/cnorxz.cc.h @@ -1,3 +1,13 @@ +// -*- C++ -*- +/** + + @file include/cnorxz.cc.h + @brief cnorxz main template header + + Copyright (c) 2024 Christian Zimmermann. All rights reserved. + Mail: chizeta@f3l.de + +**/ #include "base/base.cc.h" #include "memory/memory.cc.h" diff --git a/src/include/operation/extensions/avx.cc.h b/src/include/operation/extensions/avx.cc.h index 4660b52..51328d5 100644 --- a/src/include/operation/extensions/avx.cc.h +++ b/src/include/operation/extensions/avx.cc.h @@ -1,3 +1,13 @@ +// -*- C++ -*- +/** + + @file include/operation/extensions/avx.cc.h + @brief Register type implementaions for AVX. + + Copyright (c) 2024 Christian Zimmermann. All rights reserved. + Mail: chizeta@f3l.de + +**/ #ifndef __cxz_avx_cc_h__ #define __cxz_avx_cc_h__ diff --git a/src/include/operation/extensions/avx.h b/src/include/operation/extensions/avx.h index 20e3f52..af735f5 100644 --- a/src/include/operation/extensions/avx.h +++ b/src/include/operation/extensions/avx.h @@ -1,3 +1,13 @@ +// -*- C++ -*- +/** + + @file include/operation/extensions/avx.h + @brief Register type specialization for AVX. + + Copyright (c) 2024 Christian Zimmermann. All rights reserved. + Mail: chizeta@f3l.de + +**/ #ifndef __cxz_avx_h__ #define __cxz_avx_h__ diff --git a/src/include/operation/extensions/extensions.cc.h b/src/include/operation/extensions/extensions.cc.h index 1bdc7d9..9f64c25 100644 --- a/src/include/operation/extensions/extensions.cc.h +++ b/src/include/operation/extensions/extensions.cc.h @@ -1,3 +1,13 @@ +// -*- C++ -*- +/** + + @file include/operation/extensions/extensions.cc.h + @brief Operation extensions template implementations main header. + + Copyright (c) 2024 Christian Zimmermann. All rights reserved. + Mail: chizeta@f3l.de + +**/ #ifndef __cxz_extensions_cc_h__ #define __cxz_extensions_cc_h__ diff --git a/src/include/operation/extensions/extensions.h b/src/include/operation/extensions/extensions.h index 8a52a6b..f750641 100644 --- a/src/include/operation/extensions/extensions.h +++ b/src/include/operation/extensions/extensions.h @@ -1,3 +1,13 @@ +// -*- C++ -*- +/** + + @file include/operation/extensions/extensions.h + @brief Operation extensions main header. + + Copyright (c) 2024 Christian Zimmermann. All rights reserved. + Mail: chizeta@f3l.de + +**/ #ifndef __cxz_extensions_h__ #define __cxz_extensions_h__ diff --git a/src/include/operation/extensions/reg.cc.h b/src/include/operation/extensions/reg.cc.h index 73560b9..39465d0 100644 --- a/src/include/operation/extensions/reg.cc.h +++ b/src/include/operation/extensions/reg.cc.h @@ -1,3 +1,13 @@ +// -*- C++ -*- +/** + + @file include/operation/extensions/reg.cc.h + @brief Register type template implementations. + + Copyright (c) 2024 Christian Zimmermann. All rights reserved. + Mail: chizeta@f3l.de + +**/ #ifndef __cxz_reg_cc_h__ #define __cxz_reg_cc_h__ diff --git a/src/include/operation/extensions/reg.h b/src/include/operation/extensions/reg.h index f03b848..89cf05a 100644 --- a/src/include/operation/extensions/reg.h +++ b/src/include/operation/extensions/reg.h @@ -1,3 +1,13 @@ +// -*- C++ -*- +/** + + @file include/operation/extensions/reg.h + @brief Register type declaration. + + Copyright (c) 2024 Christian Zimmermann. All rights reserved. + Mail: chizeta@f3l.de + +**/ #ifndef __cxz_reg_h__ #define __cxz_reg_h__ diff --git a/src/include/operation/op_types.cc.h b/src/include/operation/op_types.cc.h index 1dc514f..6ae55fd 100644 --- a/src/include/operation/op_types.cc.h +++ b/src/include/operation/op_types.cc.h @@ -1,9 +1,18 @@ +// -*- C++ -*- +/** + + @file include/operation/op_types.cc.h + @brief Operation types template implementations. + + Copyright (c) 2024 Christian Zimmermann. All rights reserved. + Mail: chizeta@f3l.de + +**/ #ifndef __cxz_op_types_cc_h__ #define __cxz_op_types_cc_h__ #include "op_types.h" -//#include "xpr/xpr.h" #include "op_utility.h" #include "extensions/extensions.h" diff --git a/src/include/operation/op_types.h b/src/include/operation/op_types.h index ce0fa4a..addb020 100644 --- a/src/include/operation/op_types.h +++ b/src/include/operation/op_types.h @@ -1,4 +1,13 @@ // -*- C++ -*- +/** + + @file include/operation/op_types.h + @brief Operation types declarations. + + Copyright (c) 2024 Christian Zimmermann. All rights reserved. + Mail: chizeta@f3l.de + +**/ #ifndef __cxz_op_types_h__ #define __cxz_op_types_h__ diff --git a/src/include/operation/op_utility.cc.h b/src/include/operation/op_utility.cc.h index ed8fa45..62f9b3d 100644 --- a/src/include/operation/op_utility.cc.h +++ b/src/include/operation/op_utility.cc.h @@ -1,10 +1,19 @@ +// -*- C++ -*- +/** + + @file include/operation/op_utility.cc.h + @brief Operation utilities template implementations. + + Copyright (c) 2024 Christian Zimmermann. All rights reserved. + Mail: chizeta@f3l.de + +**/ #ifndef __cxz_op_utility_cc_h__ #define __cxz_op_utility_cc_h__ #include "op_utility.h" #include "xpr/pos_type.h" -//#include "operation/op_types.h" namespace CNORXZ { diff --git a/src/include/operation/op_utility.h b/src/include/operation/op_utility.h index dfabab4..94925c9 100644 --- a/src/include/operation/op_utility.h +++ b/src/include/operation/op_utility.h @@ -1,3 +1,13 @@ +// -*- C++ -*- +/** + + @file include/operation/op_utility.h + @brief Operation utilities declarations. + + Copyright (c) 2024 Christian Zimmermann. All rights reserved. + Mail: chizeta@f3l.de + +**/ #ifndef __cxz_op_utility_h__ #define __cxz_op_utility_h__ diff --git a/src/include/operation/operation.cc.h b/src/include/operation/operation.cc.h index b1dd93c..0db4893 100644 --- a/src/include/operation/operation.cc.h +++ b/src/include/operation/operation.cc.h @@ -1,3 +1,13 @@ +// -*- C++ -*- +/** + + @file include/operation/operation.cc.h + @brief Operation main header for template implementations. + + Copyright (c) 2024 Christian Zimmermann. All rights reserved. + Mail: chizeta@f3l.de + +**/ #include "op_types.cc.h" #include "op_utility.cc.h" diff --git a/src/include/operation/operation.h b/src/include/operation/operation.h index 1e560d9..3669206 100644 --- a/src/include/operation/operation.h +++ b/src/include/operation/operation.h @@ -1,3 +1,13 @@ +// -*- C++ -*- +/** + + @file include/operation/operation.h + @brief Operation main header. + + Copyright (c) 2024 Christian Zimmermann. All rights reserved. + Mail: chizeta@f3l.de + +**/ #include "op_types.h" #include "op_utility.h" diff --git a/src/include/ranges/dindex.h b/src/include/ranges/dindex.h index 0408cc2..82cab3c 100644 --- a/src/include/ranges/dindex.h +++ b/src/include/ranges/dindex.h @@ -2,7 +2,7 @@ /** @file include/ranges/dindex.h - @brief DIndex declaration + @brief DIndex declaration. Copyright (c) 2024 Christian Zimmermann. All rights reserved. Mail: chizeta@f3l.de diff --git a/src/include/ranges/index_format.h b/src/include/ranges/index_format.h index f67ae74..45e2b1d 100644 --- a/src/include/ranges/index_format.h +++ b/src/include/ranges/index_format.h @@ -2,8 +2,7 @@ /** @file include/ranges/index_format.h - @brief ... - + @brief Index formats declaration. Copyright (c) 2024 Christian Zimmermann. All rights reserved. Mail: chizeta@f3l.de diff --git a/src/include/ranges/index_pack.h b/src/include/ranges/index_pack.h index aab655d..ab7b02a 100644 --- a/src/include/ranges/index_pack.h +++ b/src/include/ranges/index_pack.h @@ -2,7 +2,7 @@ /** @file include/ranges/index_pack.h - @brief Index pack declaration + @brief Index pack declarations. Index packs are sets of indices. In contrast to multi-indices like (G)MIndex or YIndex, there is no format that can be used to determine @@ -10,7 +10,7 @@ Nevertheless, a function pos() is implemented, which just returns the same value as lex(). - Copyright (c) 2022 Christian Zimmermann. All rights reserved. + Copyright (c) 2024 Christian Zimmermann. All rights reserved. Mail: chizeta@f3l.de **/ diff --git a/src/include/ranges/range_base.h b/src/include/ranges/range_base.h index 0ca0037..308f07d 100644 --- a/src/include/ranges/range_base.h +++ b/src/include/ranges/range_base.h @@ -2,12 +2,12 @@ /** @file include/ranges/range_base.h - @brief RangeBase declaration + @brief RangeBase declaration. Include basic headers containing defintions and macros used throughout this library - Copyright (c) 2022 Christian Zimmermann. All rights reserved. + Copyright (c) 2024 Christian Zimmermann. All rights reserved. Mail: chizeta@f3l.de **/ diff --git a/src/include/xpr/buf_xpr.cc.h b/src/include/xpr/buf_xpr.cc.h index cac20ec..ff2d667 100644 --- a/src/include/xpr/buf_xpr.cc.h +++ b/src/include/xpr/buf_xpr.cc.h @@ -1,3 +1,13 @@ +// -*- C++ -*- +/** + + @file include/xpr/buf_xpr.cc.h + @brief Buffer xpression template implementations. + + Copyright (c) 2024 Christian Zimmermann. All rights reserved. + Mail: chizeta@f3l.de + +**/ #include "buf_xpr.h" diff --git a/src/include/xpr/buf_xpr.h b/src/include/xpr/buf_xpr.h index cd0b51f..d960c69 100644 --- a/src/include/xpr/buf_xpr.h +++ b/src/include/xpr/buf_xpr.h @@ -1,3 +1,13 @@ +// -*- C++ -*- +/** + + @file include/xpr/buf_xpr.h + @brief Buffer xpression declarations. + + Copyright (c) 2024 Christian Zimmermann. All rights reserved. + Mail: chizeta@f3l.de + +**/ #include "xpr_base.h" diff --git a/src/include/xpr/for.cc.h b/src/include/xpr/for.cc.h index 493c035..ba6a07e 100644 --- a/src/include/xpr/for.cc.h +++ b/src/include/xpr/for.cc.h @@ -1,3 +1,13 @@ +// -*- C++ -*- +/** + + @file include/xpr/for.cc.h + @brief For expressions template implementations. + + Copyright (c) 2024 Christian Zimmermann. All rights reserved. + Mail: chizeta@f3l.de + +**/ #ifndef __cxz_for_cc_h__ #define __cxz_for_cc_h__ diff --git a/src/include/xpr/for.h b/src/include/xpr/for.h index ea56ade..a12e7bb 100644 --- a/src/include/xpr/for.h +++ b/src/include/xpr/for.h @@ -1,3 +1,13 @@ +// -*- C++ -*- +/** + + @file include/xpr/for.h + @brief For expressions declarations. + + Copyright (c) 2024 Christian Zimmermann. All rights reserved. + Mail: chizeta@f3l.de + +**/ #ifndef __cxz_for_h__ #define __cxz_for_h__ diff --git a/src/include/xpr/func.cc.h b/src/include/xpr/func.cc.h index e290251..f1b6b89 100644 --- a/src/include/xpr/func.cc.h +++ b/src/include/xpr/func.cc.h @@ -1,3 +1,13 @@ +// -*- C++ -*- +/** + + @file include/xpr/func.cc.h + @brief Special function objects implementations. + + Copyright (c) 2024 Christian Zimmermann. All rights reserved. + Mail: chizeta@f3l.de + +**/ #ifndef __cxz_func_cc_h__ #define __cxz_func_cc_h__ diff --git a/src/include/xpr/func.h b/src/include/xpr/func.h index 5160674..206e843 100644 --- a/src/include/xpr/func.h +++ b/src/include/xpr/func.h @@ -1,3 +1,13 @@ +// -*- C++ -*- +/** + + @file include/xpr/func.h + @brief Special function objects declarations. + + Copyright (c) 2024 Christian Zimmermann. All rights reserved. + Mail: chizeta@f3l.de + +**/ #ifndef __cxz_func_h__ #define __cxz_func_h__ diff --git a/src/include/xpr/index_id.cc.h b/src/include/xpr/index_id.cc.h index 09eaddb..b730036 100644 --- a/src/include/xpr/index_id.cc.h +++ b/src/include/xpr/index_id.cc.h @@ -1,3 +1,13 @@ +// -*- C++ -*- +/** + + @file include/xpr/index_id.cc.h + @brief Index ID type template implementations. + + Copyright (c) 2024 Christian Zimmermann. All rights reserved. + Mail: chizeta@f3l.de + +**/ #ifndef __cxz_index_id_cc_h__ #define __cxz_index_id_cc_h__ diff --git a/src/include/xpr/index_id.h b/src/include/xpr/index_id.h index ed61d68..3cc7ae0 100644 --- a/src/include/xpr/index_id.h +++ b/src/include/xpr/index_id.h @@ -1,3 +1,13 @@ +// -*- C++ -*- +/** + + @file include/xpr/index_id.h + @brief Index ID type declarations. + + Copyright (c) 2024 Christian Zimmermann. All rights reserved. + Mail: chizeta@f3l.de + +**/ #ifndef __cxz_index_id_h__ #define __cxz_index_id_h__ diff --git a/src/include/xpr/pos_type.cc.h b/src/include/xpr/pos_type.cc.h index 77f6b92..f4ade10 100644 --- a/src/include/xpr/pos_type.cc.h +++ b/src/include/xpr/pos_type.cc.h @@ -1,3 +1,13 @@ +// -*- C++ -*- +/** + + @file include/xpr/pos_type.cc.h + @brief Position types template implementations. + + Copyright (c) 2024 Christian Zimmermann. All rights reserved. + Mail: chizeta@f3l.de + +**/ #ifndef __cxz_pos_type_cc_h__ #define __cxz_pos_type_cc_h__ diff --git a/src/include/xpr/pos_type.h b/src/include/xpr/pos_type.h index 5515407..1817726 100644 --- a/src/include/xpr/pos_type.h +++ b/src/include/xpr/pos_type.h @@ -1,3 +1,13 @@ +// -*- C++ -*- +/** + + @file include/xpr/pos_type.h + @brief Position types declarations. + + Copyright (c) 2024 Christian Zimmermann. All rights reserved. + Mail: chizeta@f3l.de + +**/ #ifndef __cxz_pos_type_h__ #define __cxz_pos_type_h__ diff --git a/src/include/xpr/vpos_type.cc.h b/src/include/xpr/vpos_type.cc.h index 19ebb9a..4df2dc1 100644 --- a/src/include/xpr/vpos_type.cc.h +++ b/src/include/xpr/vpos_type.cc.h @@ -1,3 +1,13 @@ +// -*- C++ -*- +/** + + @file include/xpr/vpos_type.cc.h + @brief Dynamic position types template implementations. + + Copyright (c) 2024 Christian Zimmermann. All rights reserved. + Mail: chizeta@f3l.de + +**/ #ifndef __cxz_vpos_type_cc_h__ #define __cxz_vpos_type_cc_h__ diff --git a/src/include/xpr/vpos_type.h b/src/include/xpr/vpos_type.h index 064cb85..985c018 100644 --- a/src/include/xpr/vpos_type.h +++ b/src/include/xpr/vpos_type.h @@ -1,3 +1,13 @@ +// -*- C++ -*- +/** + + @file include/xpr/vpos_type.h + @brief Dynamic position types declarations. + + Copyright (c) 2024 Christian Zimmermann. All rights reserved. + Mail: chizeta@f3l.de + +**/ #ifndef __cxz_vpos_type_h__ #define __cxz_vpos_type_h__ diff --git a/src/include/xpr/xpr.cc.h b/src/include/xpr/xpr.cc.h index dd8a5d6..87f3dc4 100644 --- a/src/include/xpr/xpr.cc.h +++ b/src/include/xpr/xpr.cc.h @@ -1,3 +1,13 @@ +// -*- C++ -*- +/** + + @file include/xpr/xpr.cc.h + @brief Xpression template implementations main header. + + Copyright (c) 2024 Christian Zimmermann. All rights reserved. + Mail: chizeta@f3l.de + +**/ #include "vpos_type.cc.h" #include "pos_type.cc.h" diff --git a/src/include/xpr/xpr.h b/src/include/xpr/xpr.h index 063a8bd..c98a825 100644 --- a/src/include/xpr/xpr.h +++ b/src/include/xpr/xpr.h @@ -1,3 +1,13 @@ +// -*- C++ -*- +/** + + @file include/xpr/xpr.h + @brief Xpression main header. + + Copyright (c) 2024 Christian Zimmermann. All rights reserved. + Mail: chizeta@f3l.de + +**/ #include "vpos_type.h" #include "pos_type.h" diff --git a/src/include/xpr/xpr_base.cc.h b/src/include/xpr/xpr_base.cc.h index dcc24c5..43fdf6c 100644 --- a/src/include/xpr/xpr_base.cc.h +++ b/src/include/xpr/xpr_base.cc.h @@ -1,3 +1,13 @@ +// -*- C++ -*- +/** + + @file include/xpr/xpr_base.cc.h + @brief Xpression base template implementations. + + Copyright (c) 2024 Christian Zimmermann. All rights reserved. + Mail: chizeta@f3l.de + +**/ #ifndef __cxz_xpr_base_cc_h__ #define __cxz_xpr_base_cc_h__ diff --git a/src/include/xpr/xpr_base.h b/src/include/xpr/xpr_base.h index 05e7f8b..a25cdee 100644 --- a/src/include/xpr/xpr_base.h +++ b/src/include/xpr/xpr_base.h @@ -1,3 +1,13 @@ +// -*- C++ -*- +/** + + @file include/xpr/xpr_base.h + @brief Xpression base declarations. + + Copyright (c) 2024 Christian Zimmermann. All rights reserved. + Mail: chizeta@f3l.de + +**/ #ifndef __cxz_xpr_base_h__ #define __cxz_xpr_base_h__ diff --git a/src/lib/base/config.cc b/src/lib/base/config.cc index f13756a..a502939 100644 --- a/src/lib/base/config.cc +++ b/src/lib/base/config.cc @@ -1,3 +1,15 @@ +// -*- C++ -*- +/** + + @file lib/base/config.cc + @brief Runtime config functions implementations. + + Declare functions returning version and configuration infos. + + Copyright (c) 2024 Christian Zimmermann. All rights reserved. + Mail: chizeta@f3l.de + +**/ #include "base/config.h" diff --git a/src/lib/base/to_string.cc b/src/lib/base/to_string.cc index 8289ffc..53fe25e 100644 --- a/src/lib/base/to_string.cc +++ b/src/lib/base/to_string.cc @@ -1,3 +1,15 @@ +// -*- C++ -*- +/** + + @file lib/base/to_string.cc + @brief String converter implementations. + + Declaration of functions that convert a given object/type to a string. + + Copyright (c) 2022 Christian Zimmermann. All rights reserved. + Mail: chizeta@f3l.de + +**/ #include "base/base.h" diff --git a/src/lib/base/uuid.cc b/src/lib/base/uuid.cc index 7ecbced..c2b4e2c 100644 --- a/src/lib/base/uuid.cc +++ b/src/lib/base/uuid.cc @@ -1,3 +1,13 @@ +// -*- C++ -*- +/** + + @file lib/base/uuid.cc + @brief cnorxz uuid implementation. + + Copyright (c) 2022 Christian Zimmermann. All rights reserved. + Mail: chizeta@f3l.de + +**/ #include #include diff --git a/src/lib/memory/memcount.cc b/src/lib/memory/memcount.cc index 7ca0ebb..2332efe 100644 --- a/src/lib/memory/memcount.cc +++ b/src/lib/memory/memcount.cc @@ -2,10 +2,9 @@ /** @file lib/memory/memcount.cc - @brief ... + @brief Implementation of MemCount member functions. - - Copyright (c) 2022 Christian Zimmermann. All rights reserved. + Copyright (c) 2024 Christian Zimmermann. All rights reserved. Mail: chizeta@f3l.de **/ diff --git a/src/lib/ranges/crange.cc b/src/lib/ranges/crange.cc index cf6ec9e..9b797d3 100644 --- a/src/lib/ranges/crange.cc +++ b/src/lib/ranges/crange.cc @@ -1,3 +1,13 @@ +// -*- C++ -*- +/** + + @file lib/ranges/crange.cc + @brief CRange and CIndex member function implementation. + + Copyright (c) 2024 Christian Zimmermann. All rights reserved. + Mail: chizeta@f3l.de + +**/ #include "ranges/ranges.h" #include "ranges/prange.h" diff --git a/src/lib/ranges/dindex.cc b/src/lib/ranges/dindex.cc index c1dc73a..1e85da4 100644 --- a/src/lib/ranges/dindex.cc +++ b/src/lib/ranges/dindex.cc @@ -1,3 +1,13 @@ +// -*- C++ -*- +/** + + @file lib/ranges/dindex.cc + @brief DIndex implementation. + + Copyright (c) 2024 Christian Zimmermann. All rights reserved. + Mail: chizeta@f3l.de + +**/ #include "ranges/ranges.h" diff --git a/src/lib/ranges/index_format.cc b/src/lib/ranges/index_format.cc index 36580da..746ed8c 100644 --- a/src/lib/ranges/index_format.cc +++ b/src/lib/ranges/index_format.cc @@ -1,3 +1,13 @@ +// -*- C++ -*- +/** + + @file lib/ranges/index_format.cc + @brief Index formats implementations. + + Copyright (c) 2024 Christian Zimmermann. All rights reserved. + Mail: chizeta@f3l.de + +**/ #include "ranges/index_format.h" diff --git a/src/lib/ranges/index_pack.cc b/src/lib/ranges/index_pack.cc index 5ed6bc2..5e66ee1 100644 --- a/src/lib/ranges/index_pack.cc +++ b/src/lib/ranges/index_pack.cc @@ -1,3 +1,13 @@ +// -*- C++ -*- +/** + + @file lib/ranges/index_pack.cc + @brief Index pack implementations. + + Copyright (c) 2024 Christian Zimmermann. All rights reserved. + Mail: chizeta@f3l.de + +**/ #include "ranges/ranges.h" diff --git a/src/lib/ranges/range_base.cc b/src/lib/ranges/range_base.cc index a90369b..749c5f7 100644 --- a/src/lib/ranges/range_base.cc +++ b/src/lib/ranges/range_base.cc @@ -1,3 +1,13 @@ +// -*- C++ -*- +/** + + @file lib/ranges/range_base.cc + @brief RangeBase implementation. + + Copyright (c) 2024 Christian Zimmermann. All rights reserved. + Mail: chizeta@f3l.de + +**/ #include "ranges/ranges.h" #include "array/array.h" diff --git a/src/lib/ranges/yrange.cc b/src/lib/ranges/yrange.cc index b456995..0f799b9 100644 --- a/src/lib/ranges/yrange.cc +++ b/src/lib/ranges/yrange.cc @@ -1,3 +1,13 @@ +// -*- C++ -*- +/** + + @file lib/ranges/yrange.cc + @brief YRange and YIndex implementations. + + Copyright (c) 2022 Christian Zimmermann. All rights reserved. + Mail: chizeta@f3l.de + +**/ #include "ranges/ranges.h" #include "array/array.h" diff --git a/src/opt/cereal/tests/cereal_unit_test.cc b/src/opt/cereal/tests/cereal_unit_test.cc index 1fc1039..ac0a551 100644 --- a/src/opt/cereal/tests/cereal_unit_test.cc +++ b/src/opt/cereal/tests/cereal_unit_test.cc @@ -1,3 +1,13 @@ +// -*- C++ -*- +/** + + @file opt/cereal/tests/cereal_unit_test.cc + @brief cnorxz cereal unit tests. + + Copyright (c) 2024 Christian Zimmermann. All rights reserved. + Mail: chizeta@f3l.de + +**/ #include #include diff --git a/src/opt/hdf5/include/h5_type_id.cc.h b/src/opt/hdf5/include/h5_type_id.cc.h index b7624bd..e890eb2 100644 --- a/src/opt/hdf5/include/h5_type_id.cc.h +++ b/src/opt/hdf5/include/h5_type_id.cc.h @@ -1,7 +1,7 @@ // -*- C++ -*- /** - @file opt/hdf5/include/h5_type_id.h + @file opt/hdf5/include/h5_type_id.cc.h @brief TypeId template implementation. Copyright (c) 2024 Christian Zimmermann. All rights reserved. diff --git a/src/opt/hdf5/include/h5_types.h b/src/opt/hdf5/include/h5_types.h index 46beb8d..2437e9f 100644 --- a/src/opt/hdf5/include/h5_types.h +++ b/src/opt/hdf5/include/h5_types.h @@ -1,7 +1,7 @@ // -*- C++ -*- /** - @file opt/hdf5/include/types.h + @file opt/hdf5/include/h5_types.h @brief Declaration of hdf5 related library types This file contains the declaration of all hdf5 related library types diff --git a/src/opt/hdf5/lib/h5_dataset.cc b/src/opt/hdf5/lib/h5_dataset.cc index 1fbfe72..a3ef41d 100644 --- a/src/opt/hdf5/lib/h5_dataset.cc +++ b/src/opt/hdf5/lib/h5_dataset.cc @@ -1,3 +1,13 @@ +// -*- C++ -*- +/** + + @file opt/hdf5/lib/h5_dataset.cc + @brief Dataset implementations. + + Copyright (c) 2024 Christian Zimmermann. All rights reserved. + Mail: chizeta@f3l.de + + **/ #include "h5_dataset.h" diff --git a/src/opt/hdf5/lib/h5_file.cc b/src/opt/hdf5/lib/h5_file.cc index fe42fa5..0730786 100644 --- a/src/opt/hdf5/lib/h5_file.cc +++ b/src/opt/hdf5/lib/h5_file.cc @@ -1,3 +1,13 @@ +// -*- C++ -*- +/** + + @file opt/hdf5/lib/h5_file.cc + @brief Group implementations. + + Copyright (c) 2024 Christian Zimmermann. All rights reserved. + Mail: chizeta@f3l.de + + **/ #include "h5_file.h" #include diff --git a/src/opt/hdf5/lib/h5_group.cc b/src/opt/hdf5/lib/h5_group.cc index a5d093f..37f8bc3 100644 --- a/src/opt/hdf5/lib/h5_group.cc +++ b/src/opt/hdf5/lib/h5_group.cc @@ -1,3 +1,13 @@ +// -*- C++ -*- +/** + + @file opt/hdf5/lib/h5_group.cc + @brief Group implementations. + + Copyright (c) 2024 Christian Zimmermann. All rights reserved. + Mail: chizeta@f3l.de + + **/ #include "h5_group.h" #include "h5_table.h" diff --git a/src/opt/hdf5/lib/h5_table.cc b/src/opt/hdf5/lib/h5_table.cc index 268e8b3..1ac7fa5 100644 --- a/src/opt/hdf5/lib/h5_table.cc +++ b/src/opt/hdf5/lib/h5_table.cc @@ -1,3 +1,13 @@ +// -*- C++ -*- +/** + + @file opt/hdf5/lib/h5_table.cc + @brief Table implementations. + + Copyright (c) 2024 Christian Zimmermann. All rights reserved. + Mail: chizeta@f3l.de + + **/ #include #include "h5_table.h" diff --git a/src/opt/hdf5/tests/h5_basic_unit_test.cc b/src/opt/hdf5/tests/h5_basic_unit_test.cc index 41399b7..e589556 100644 --- a/src/opt/hdf5/tests/h5_basic_unit_test.cc +++ b/src/opt/hdf5/tests/h5_basic_unit_test.cc @@ -1,3 +1,13 @@ +// -*- C++ -*- +/** + + @file opt/hdf5/tests/h5_basic_unit_test.cc + @brief cnorxz hdf5 basic unit tests. + + Copyright (c) 2024 Christian Zimmermann. All rights reserved. + Mail: chizeta@f3l.de + +**/ #include #include diff --git a/src/tests/index_format_test.cc b/src/tests/index_format_test.cc index e747d5f..4e33128 100644 --- a/src/tests/index_format_test.cc +++ b/src/tests/index_format_test.cc @@ -1,10 +1,19 @@ +// -*- C++ -*- +/** + + @file tests/index_format_test.cc + @brief Index format unit tests. + + Copyright (c) 2024 Christian Zimmermann. All rights reserved. + Mail: chizeta@f3l.de + +**/ #include #include #include "gtest/gtest.h" -//#include "cnorxz.h" #include "ranges/ranges.h" #include "array/array.h" diff --git a/src/tests/marray_unit_test.cc b/src/tests/marray_unit_test.cc index a565438..7550f25 100644 --- a/src/tests/marray_unit_test.cc +++ b/src/tests/marray_unit_test.cc @@ -1,4 +1,13 @@ // -*- C++ -*- +/** + + @file tests/marray_unit_test.cc + @brief MArray unit tests. + + Copyright (c) 2024 Christian Zimmermann. All rights reserved. + Mail: chizeta@f3l.de + +**/ #include #include diff --git a/src/tests/op_perf_test.cc b/src/tests/op_perf_test.cc deleted file mode 100644 index 6c8bf50..0000000 --- a/src/tests/op_perf_test.cc +++ /dev/null @@ -1,304 +0,0 @@ -// -*- C++ -*- - -#include -#include -#include - -#include "cnorxz.h" -#include "conversions.h" - -#include -#include -#include - -#define ONLY_SPIN - -namespace MAT = CNORXZ; - -namespace { - - double xround(double arg) - { - return roundf(arg * 100000.) / 100000.; - } - - using namespace MAT; - - template - void swapFactory(std::shared_ptr& fptr) - { - auto nptr = std::make_shared(); - fptr = nptr; - } - - template - void swapFactory(std::shared_ptr& fptr, std::initializer_list ilist) - { - vector tmp = ilist; - auto nptr = std::make_shared( tmp ); - fptr = nptr; - } - - template - void swapFactory(std::shared_ptr& fptr, vector& ilist) - { - vector tmp = ilist; - auto nptr = std::make_shared( tmp ); - fptr = nptr; - } - - - template - void swapMFactory(std::shared_ptr& fptr, const Rs&... rs) - { - auto nptr = std::make_shared( rs... ); - fptr = nptr; - } - - template - auto mkt(Ts&&... ts) -> decltype(std::make_tuple(ts...)) - { - return std::make_tuple(ts...); - } - - template - auto mkts(Ts&&... ts) -> decltype(std::make_tuple(ts...)) - { - return std::make_tuple(static_cast( ts )...); - } -#ifndef ONLY_SPIN - class OpTest_Performance - { - public: - - typedef SingleRangeFactory SRF; - typedef SRF::oType SRange; - - typedef MultiRangeFactory MRF; - typedef MRF::oType MRange; - - OpTest_Performance() - { - - vector initvec1(vs1); - cv1.resize(vs1); - for(size_t i = 0; i != vs1; ++i){ - initvec1[i] = i; - cv1[i] = sqrt( static_cast(i)*0.53 ); - } - - vector initvec2(vs2); - cv2.resize(vs2*vs1); - for(size_t i = 0; i != vs2; ++i){ - initvec2[i] = i; - for(size_t j = 0; j != vs1; ++j){ - cv2[i*vs1 + j] = static_cast(i) * sin(static_cast(j)*0.4); - } - } - - swapFactory(rfbptr, initvec1); - sr1ptr = std::dynamic_pointer_cast(rfbptr->create()); - - swapFactory(rfbptr, initvec2); - sr2ptr = std::dynamic_pointer_cast(rfbptr->create()); - - swapMFactory(rfbptr, sr2ptr, sr1ptr); - mrptr = std::dynamic_pointer_cast(rfbptr->create()); - } - - void PCheck(); - - - private: - //const size_t vs1 = 10000; - //const size_t vs2 = 1000; - const size_t vs1 = 4000; - const size_t vs2 = 2500; - - std::shared_ptr rfbptr; - std::shared_ptr sr1ptr; - std::shared_ptr sr2ptr; - std::shared_ptr mrptr; - - vector cv1; - vector cv2; - }; -#endif - class OpTest_Spin - { - public: - - typedef ClassicRF CRF; - typedef ClassicRange CR; - - typedef SpinRF SRF; - typedef SpinRange SR; - typedef MultiRangeFactory SR8F; - typedef SR8F::oType SR8; - - static const size_t os = 3000; - static const size_t is = 65536; - static const size_t s = is*os; - - OpTest_Spin() - { - data.resize(is); - for(size_t i = 0; i != is; ++i){ - double arg = static_cast( i - s ) - 0.1; - data[i] = sin(arg); - //VCHECK(data[i]); - } - SRF f; - sr = std::dynamic_pointer_cast(f.create()); - CRF cf(os); - cr = std::dynamic_pointer_cast(cf.create()); - } - - void contract(); - - private: - - vector data; - std::shared_ptr sr; - std::shared_ptr cr; - }; - - void OpTest_Spin::contract() - { - Array ma( sr, sr, sr, sr, sr, sr, sr, sr, data); - Array res1( cr, sr, sr ); - - auto ii = MAT::getIndex(cr); - auto jj = MAT::getIndex(cr); - auto alpha = MAT::getIndex(); - auto beta = MAT::getIndex(); - auto gamma = MAT::getIndex(); - auto delta = MAT::getIndex(); - auto deltap = MAT::getIndex(); - //auto deltap = MAT::getIndex>(); - - auto mix = MAT::mkMIndex( jj, alpha, beta, gamma ); - - - vector vres(4*4*os); - for(size_t d = 0; d != 4; ++d){ - for(size_t p = 0; p != 4; ++p){ - const size_t tidx = d*4 + p; - vres[tidx] = 0.; - } - } - auto begin2 = std::chrono::system_clock::now(); - double* vrptr = vres.data(); - double* dptr = data.data(); - for(size_t i = 0; i != os; ++i){ - for(size_t d = 0; d != 4; ++d){ - for(size_t j = 0; j != os; ++j) { - for(size_t a = 0; a != 4; ++a){ - for(size_t b = 0; b != 4; ++b){ - for(size_t c = 0; c != 4; ++c){ - const size_t tidx = i*4*4 + d*4; - const size_t sidx = /*i*65536 +*/ d*4*4*4*4*4*4*4 + a*5*4*4*4*4*4 + b*5*4*4*4 + c*5*4; - double* xvrptr = vrptr + tidx; - double* xdptr = dptr + sidx; -#pragma omp simd aligned(xvrptr, xdptr: 32) - for(int p = 0; p < 4; p++){ - xvrptr[p] += xdptr[p]; - } - } - } - } - } - } - } - auto end2 = std::chrono::system_clock::now(); - std::cout << "vector - for loop time: " << std::chrono::duration(end2-begin2).count() - << std::endl; - - - auto begin = std::chrono::system_clock::now(); - //for(size_t i = 0; i != os; ++i){ - res1(ii ,delta, deltap).par() += ma(delta, alpha, alpha, beta, beta, gamma, gamma, deltap).c(mix); - //tcast(res1)(ii ,delta, deltap).par() += tcast(ma)(delta, alpha, alpha, beta, beta, gamma, gamma, deltap).c(mix); - //} - auto end = std::chrono::system_clock::now(); - std::cout << "Array time: " << std::chrono::duration(end-begin).count() - << std::endl; - - assert( xround(res1.at(mkts(0,0,0))) == xround(vres[0]) ); - assert( xround(res1.at(mkts(0,0,1))) == xround(vres[1]) ); - assert( xround(res1.at(mkts(0,0,2))) == xround(vres[2]) ); - assert( xround(res1.at(mkts(0,0,3))) == xround(vres[3]) ); - - assert( xround(res1.at(mkts(0,1,0))) == xround(vres[4]) ); - assert( xround(res1.at(mkts(0,1,1))) == xround(vres[5]) ); - assert( xround(res1.at(mkts(0,1,2))) == xround(vres[6]) ); - assert( xround(res1.at(mkts(0,1,3))) == xround(vres[7]) ); - - assert( xround(res1.at(mkts(0,2,0))) == xround(vres[8]) ); - assert( xround(res1.at(mkts(0,2,1))) == xround(vres[9]) ); - assert( xround(res1.at(mkts(0,2,2))) == xround(vres[10]) ); - assert( xround(res1.at(mkts(0,2,3))) == xround(vres[11]) ); - - assert( xround(res1.at(mkts(0,3,0))) == xround(vres[12]) ); - assert( xround(res1.at(mkts(0,3,1))) == xround(vres[13]) ); - assert( xround(res1.at(mkts(0,3,2))) == xround(vres[14]) ); - assert( xround(res1.at(mkts(0,3,3))) == xround(vres[15]) ); - - std::cout << "ratio: " - << std::chrono::duration(end-begin).count() / std::chrono::duration(end2-begin2).count() - << std::endl; - } -#ifndef ONLY_SPIN - void OpTest_Performance::PCheck() - { - Array ma2(mrptr, cv2); - Array ma1(sr1ptr, cv1); - Array res(mrptr); - - auto si1 = MAT::getIndex(sr1ptr); - auto si2 = MAT::getIndex(sr2ptr); - auto mi = MAT::getIndex(mrptr); - (*mi)(si2, si1); - - std::clock_t begin = std::clock(); - - res(mi) = ma2(mi) * ma1(si1); - - std::clock_t end = std::clock(); - std::cout << "Array time: " << static_cast( end - begin ) / CLOCKS_PER_SEC - << std::endl; - - vector res2(vs1*vs2); - std::clock_t begin2 = std::clock(); - - for(size_t i = 0; i != vs2; ++i){ - for(size_t j = 0; j != vs1; ++j){ - res2[i*vs1 + j] = cv1[j] * cv2[i*vs1 + j]; - } - } - - std::clock_t end2 = std::clock(); - std::cout << "vector - for loop time: " << static_cast( end2 - begin2 ) / CLOCKS_PER_SEC - << std::endl; - - std::cout << "ratio: " << static_cast( end - begin ) / static_cast( end2 - begin2 ) << std::endl; - - assert( xround( res.at(mkt(7,9)) ) == xround(res2[7*vs1 + 9]) ); - //assert( xround( res.at(mkt(700,900)) ) == xround(res2[700*vs1 + 900]) ); - - } -#endif -} // anonymous namspace - -int main(int argc, char** argv) -{ -#ifndef ONLY_SPIN - OpTest_Performance pt; - pt.PCheck(); -#endif - OpTest_Spin st; - st.contract(); - - - return 0; -} diff --git a/src/tests/operation_unit_test.cc b/src/tests/operation_unit_test.cc index 8a4e532..5812f02 100644 --- a/src/tests/operation_unit_test.cc +++ b/src/tests/operation_unit_test.cc @@ -1,3 +1,13 @@ +// -*- C++ -*- +/** + + @file tests/operation_unit_test.cc + @brief Operation unit tests. + + Copyright (c) 2024 Christian Zimmermann. All rights reserved. + Mail: chizeta@f3l.de + +**/ #include #include diff --git a/src/tests/range_unit_test.cc b/src/tests/range_unit_test.cc index 4ac711e..4a56139 100644 --- a/src/tests/range_unit_test.cc +++ b/src/tests/range_unit_test.cc @@ -1,10 +1,19 @@ +// -*- C++ -*- +/** + + @file tests/range_unit_test.cc + @brief Range unit tests. + + Copyright (c) 2024 Christian Zimmermann. All rights reserved. + Mail: chizeta@f3l.de + +**/ #include #include #include "gtest/gtest.h" -//#include "cnorxz.h" #include "ranges/ranges.h" #include "array/array.h" diff --git a/src/tests/test_numbers.cc b/src/tests/test_numbers.cc index 81b1240..cdef0f4 100644 --- a/src/tests/test_numbers.cc +++ b/src/tests/test_numbers.cc @@ -1,3 +1,13 @@ +// -*- C++ -*- +/** + + @file tests/test_numbers.cc + @brief Test numbers instanciation. + + Copyright (c) 2024 Christian Zimmermann. All rights reserved. + Mail: chizeta@f3l.de + +**/ #include "test_numbers.h" @@ -5,6 +15,8 @@ namespace CNORXZ { namespace Test { + /** @cond 0 */ Vector Numbers::sCont; + /** @endcond */ } } diff --git a/src/tests/test_numbers.h b/src/tests/test_numbers.h index 0d4e52a..05d9cc7 100644 --- a/src/tests/test_numbers.h +++ b/src/tests/test_numbers.h @@ -1,10 +1,18 @@ +// -*- C++ -*- +/** + + @file tests/test_numbers.h + @brief Test numbers utilities. + + Copyright (c) 2024 Christian Zimmermann. All rights reserved. + Mail: chizeta@f3l.de + +**/ #ifndef __test_numbers_h__ #define __test_numbers_h__ #include -//#include "base/types.h" -//#include "base/assert.h" #include "base/base.h" namespace CNORXZ diff --git a/src/tests/xpr_unit_test.cc b/src/tests/xpr_unit_test.cc index 8e72fec..567ff8d 100644 --- a/src/tests/xpr_unit_test.cc +++ b/src/tests/xpr_unit_test.cc @@ -1,3 +1,13 @@ +// -*- C++ -*- +/** + + @file tests/xpr_unit_test.cc + @brief Xpression unit tests. + + Copyright (c) 2024 Christian Zimmermann. All rights reserved. + Mail: chizeta@f3l.de + +**/ #include "gtest/gtest.h" From 8a0fdf7a7cdc73ab5b2721121522cabcef42ee8f Mon Sep 17 00:00:00 2001 From: Christian Zimmermann Date: Sat, 3 Feb 2024 23:21:40 +0100 Subject: [PATCH 5/9] improve comment notation + add missing briefs --- src/include/array/aindex.cc.h | 5 +- src/include/array/aindex.h | 5 +- src/include/array/array_base.cc.h | 5 +- src/include/array/array_base.h | 5 +- src/include/array/marray.cc.h | 5 +- src/include/array/marray.h | 5 +- src/include/array/slice.cc.h | 5 +- src/include/array/slice.h | 5 +- src/include/base/types.h | 4 +- src/include/memory/memcount.h | 5 +- src/include/memory/memory.cc.h | 5 +- src/include/memory/memory.h | 5 +- src/include/operation/basic_operations.cc.h | 18 +++---- src/include/operation/extensions/avx.cc.h | 24 ++++----- src/include/operation/extensions/reg.cc.h | 24 ++++----- src/include/operation/extensions/reg.h | 36 +++++++------- src/include/ranges/crange.cc.h | 5 +- src/include/ranges/dindex.cc.h | 3 +- src/include/ranges/dindex.h | 2 +- src/include/ranges/eindex.cc.h | 5 +- src/include/ranges/eindex.h | 3 +- src/include/ranges/index_base.cc.h | 17 +++---- src/include/ranges/index_base.h | 5 +- src/include/ranges/index_format.cc.h | 23 +++++---- src/include/ranges/index_mul.cc.h | 21 ++++---- src/include/ranges/index_pack.cc.h | 29 ++++++----- src/include/ranges/lindex.cc.h | 3 +- src/include/ranges/range_base.cc.h | 5 +- src/include/ranges/ranges.cc.h | 5 +- src/include/ranges/srange.cc.h | 29 ++++++----- src/include/ranges/urange.cc.h | 29 ++++++----- src/include/ranges/xindex.cc.h | 11 ++--- src/include/xpr/for.cc.h | 48 +++++++++--------- src/include/xpr/pos_type.cc.h | 54 ++++++++++----------- src/include/xpr/pos_type.h | 12 ++--- src/include/xpr/vpos_type.cc.h | 30 ++++++------ src/include/xpr/xpr_base.cc.h | 12 ++--- src/lib/ranges/range_base.cc | 18 +++---- src/lib/ranges/yrange.cc | 42 ++++++++-------- src/opt/cereal/include/cer_ranges.cc.h | 12 ++--- 40 files changed, 279 insertions(+), 305 deletions(-) diff --git a/src/include/array/aindex.cc.h b/src/include/array/aindex.cc.h index ac45c4a..e28c257 100644 --- a/src/include/array/aindex.cc.h +++ b/src/include/array/aindex.cc.h @@ -2,10 +2,9 @@ /** @file include/array/aindex.cc.h - @brief ... + @brief Array index template implementations. - - Copyright (c) 2022 Christian Zimmermann. All rights reserved. + Copyright (c) 2024 Christian Zimmermann. All rights reserved. Mail: chizeta@f3l.de **/ diff --git a/src/include/array/aindex.h b/src/include/array/aindex.h index 0352376..7f7a411 100644 --- a/src/include/array/aindex.h +++ b/src/include/array/aindex.h @@ -2,10 +2,9 @@ /** @file include/array/aindex.h - @brief ... + @brief Array index declaration. - - Copyright (c) 2022 Christian Zimmermann. All rights reserved. + Copyright (c) 2024 Christian Zimmermann. All rights reserved. Mail: chizeta@f3l.de **/ diff --git a/src/include/array/array_base.cc.h b/src/include/array/array_base.cc.h index ae1218f..cd71cdf 100644 --- a/src/include/array/array_base.cc.h +++ b/src/include/array/array_base.cc.h @@ -2,10 +2,9 @@ /** @file include/array/array_base.cc.h - @brief ... + @brief Array base class template implementations. - - Copyright (c) 2022 Christian Zimmermann. All rights reserved. + Copyright (c) 2024 Christian Zimmermann. All rights reserved. Mail: chizeta@f3l.de **/ diff --git a/src/include/array/array_base.h b/src/include/array/array_base.h index f74f83b..9e3ad07 100644 --- a/src/include/array/array_base.h +++ b/src/include/array/array_base.h @@ -2,10 +2,9 @@ /** @file include/array/array_base.h - @brief ... + @brief Array base class declarations. - - Copyright (c) 2022 Christian Zimmermann. All rights reserved. + Copyright (c) 2024 Christian Zimmermann. All rights reserved. Mail: chizeta@f3l.de **/ diff --git a/src/include/array/marray.cc.h b/src/include/array/marray.cc.h index 3ea3923..d60b07d 100644 --- a/src/include/array/marray.cc.h +++ b/src/include/array/marray.cc.h @@ -2,10 +2,9 @@ /** @file include/array/marray.cc.h - @brief ... + @brief MArray implementations. - - Copyright (c) 2022 Christian Zimmermann. All rights reserved. + Copyright (c) 2024 Christian Zimmermann. All rights reserved. Mail: chizeta@f3l.de **/ diff --git a/src/include/array/marray.h b/src/include/array/marray.h index 9445ec7..384cacb 100644 --- a/src/include/array/marray.h +++ b/src/include/array/marray.h @@ -2,10 +2,9 @@ /** @file include/array/marray.h - @brief ... + @brief MArray declarations. - - Copyright (c) 2022 Christian Zimmermann. All rights reserved. + Copyright (c) 2024 Christian Zimmermann. All rights reserved. Mail: chizeta@f3l.de **/ diff --git a/src/include/array/slice.cc.h b/src/include/array/slice.cc.h index 1dca0cf..95131b9 100644 --- a/src/include/array/slice.cc.h +++ b/src/include/array/slice.cc.h @@ -2,10 +2,9 @@ /** @file include/array/slice.cc.h - @brief ... + @brief Slice implementations. - - Copyright (c) 2022 Christian Zimmermann. All rights reserved. + Copyright (c) 2024 Christian Zimmermann. All rights reserved. Mail: chizeta@f3l.de **/ diff --git a/src/include/array/slice.h b/src/include/array/slice.h index a636b1a..fab06da 100644 --- a/src/include/array/slice.h +++ b/src/include/array/slice.h @@ -2,10 +2,9 @@ /** @file include/array/slice.h - @brief ... + @brief Slice declarations. - - Copyright (c) 2022 Christian Zimmermann. All rights reserved. + Copyright (c) 2024 Christian Zimmermann. All rights reserved. Mail: chizeta@f3l.de **/ diff --git a/src/include/base/types.h b/src/include/base/types.h index 77dbc98..9ba70d3 100644 --- a/src/include/base/types.h +++ b/src/include/base/types.h @@ -84,7 +84,7 @@ namespace CNORXZ | library types | +===================*/ - /*** + /* Naming Prefixes: D = Y = Dynamic V = X = Virtual @@ -100,7 +100,7 @@ namespace CNORXZ A = (const) Array B = (mutable) Array F = Functional, Map,... - ***/ + */ // default template parameter class None {}; diff --git a/src/include/memory/memcount.h b/src/include/memory/memcount.h index f69c261..6dc9268 100644 --- a/src/include/memory/memcount.h +++ b/src/include/memory/memcount.h @@ -2,10 +2,9 @@ /** @file include/memory/memcount.h - @brief ... + @brief MemCount declaration. - - Copyright (c) 2022 Christian Zimmermann. All rights reserved. + Copyright (c) 2024 Christian Zimmermann. All rights reserved. Mail: chizeta@f3l.de **/ diff --git a/src/include/memory/memory.cc.h b/src/include/memory/memory.cc.h index 19a1181..82ffc2f 100644 --- a/src/include/memory/memory.cc.h +++ b/src/include/memory/memory.cc.h @@ -2,10 +2,9 @@ /** @file include/memory/memory.cc.h - @brief ... + @brief Memory template implementations main header. - - Copyright (c) 2022 Christian Zimmermann. All rights reserved. + Copyright (c) 2024 Christian Zimmermann. All rights reserved. Mail: chizeta@f3l.de **/ diff --git a/src/include/memory/memory.h b/src/include/memory/memory.h index 6f1ec8c..85be208 100644 --- a/src/include/memory/memory.h +++ b/src/include/memory/memory.h @@ -2,10 +2,9 @@ /** @file include/memory/memory.h - @brief ... + @brief Memory main heade. - - Copyright (c) 2022 Christian Zimmermann. All rights reserved. + Copyright (c) 2024 Christian Zimmermann. All rights reserved. Mail: chizeta@f3l.de **/ diff --git a/src/include/operation/basic_operations.cc.h b/src/include/operation/basic_operations.cc.h index df23e01..49d937c 100644 --- a/src/include/operation/basic_operations.cc.h +++ b/src/include/operation/basic_operations.cc.h @@ -16,9 +16,9 @@ namespace CNORXZ { - /************************************ - * standard operatrions (unary) * - ************************************/ + /*==================================+ + | standard operatrions (unary) | + +==================================*/ template constexpr decltype(auto) minus(const COpInterface& op) @@ -26,9 +26,9 @@ namespace CNORXZ return operation( [](const auto& a) { return -a; }, op.THIS() ); } - /************************************* - * standard operatrions (binary) * - *************************************/ + /*===================================+ + | standard operatrions (binary) | + +===================================*/ template constexpr decltype(auto) plus(const COpInterface& op1, const COpInterface& op2) @@ -65,9 +65,9 @@ namespace CNORXZ op1.THIS(), op2.THIS() ); } - /***************************************** - * operators for standard operations * - *****************************************/ + /*=======================================+ + | operators for standard operations | + +=======================================*/ template constexpr decltype(auto) operator-(const COpInterface& op) diff --git a/src/include/operation/extensions/avx.cc.h b/src/include/operation/extensions/avx.cc.h index 51328d5..88c0020 100644 --- a/src/include/operation/extensions/avx.cc.h +++ b/src/include/operation/extensions/avx.cc.h @@ -16,9 +16,9 @@ namespace CNORXZ { - /*********************** - * PlusCC / PlusCX * - ***********************/ + /*=====================+ + | PlusCC / PlusCX | + +=====================*/ inline decltype(auto) PlusCC::eval(const Consecutive& a, @@ -80,9 +80,9 @@ namespace CNORXZ return o; } - /************************* - * MinusCC / MinusCX * - *************************/ + /*=======================+ + | MinusCC / MinusCX | + +=======================*/ inline decltype(auto) MinusCC::eval(const Consecutive& a, @@ -144,9 +144,9 @@ namespace CNORXZ return o; } - /*********************************** - * MultipliesCC / MultipliesCX * - ***********************************/ + /*=================================+ + | MultipliesCC / MultipliesCX | + +=================================*/ inline decltype(auto) MultipliesCC::eval(const Consecutive& a, @@ -210,9 +210,9 @@ namespace CNORXZ } - /***************************** - * DividesCC / DividesCX * - *****************************/ + /*===========================+ + | DividesCC / DividesCX | + +===========================*/ inline decltype(auto) DividesCC::eval(const Consecutive& a, diff --git a/src/include/operation/extensions/reg.cc.h b/src/include/operation/extensions/reg.cc.h index 39465d0..f3d85fb 100644 --- a/src/include/operation/extensions/reg.cc.h +++ b/src/include/operation/extensions/reg.cc.h @@ -120,9 +120,9 @@ namespace CNORXZ return consecFuncAI(f, dst, args..., std::make_index_sequence{}); } - /****************************** - * basic operations: plus * - ******************************/ + /*============================+ + | basic operations: plus | + +============================*/ template constexpr decltype(auto) @@ -156,9 +156,9 @@ namespace CNORXZ return consecFuncA( [](auto& x, const auto& y) { return x += y; }, o, a ); } - /******************************* - * basic operations: minus * - *******************************/ + /*=============================+ + | basic operations: minus | + +=============================*/ template constexpr decltype(auto) MinusCC::eval(const Consecutive& a, const Consecutive& b) @@ -190,9 +190,9 @@ namespace CNORXZ return consecFuncA( [](auto& x, const auto& y) { return x -= y; }, o, a ); } - /*********************************** - * basic operations: muliplies * - ***********************************/ + /*=================================+ + | basic operations: muliplies | + +=================================*/ template constexpr decltype(auto) MultipliesCC::eval(const Consecutive& a, const Consecutive& b) @@ -224,9 +224,9 @@ namespace CNORXZ return consecFuncA( [](const auto& x, const auto& y) { return x *= y; }, o, a ); } - /********************************* - * basic operations: divides * - *********************************/ + /*===============================+ + | basic operations: divides | + +===============================*/ template constexpr decltype(auto) DividesCC::eval(const Consecutive& a, const Consecutive& b) diff --git a/src/include/operation/extensions/reg.h b/src/include/operation/extensions/reg.h index 89cf05a..8cbf699 100644 --- a/src/include/operation/extensions/reg.h +++ b/src/include/operation/extensions/reg.h @@ -43,9 +43,9 @@ namespace CNORXZ template struct consecutive_size> { static constexpr SizeT value = N; }; - /**************************************** - * consecutive generating functions * - ****************************************/ + /*======================================+ + | consecutive generating functions | + +======================================*/ template inline decltype(auto) vregi(const T* d, const EPosT& pos, std::index_sequence is); @@ -56,9 +56,9 @@ namespace CNORXZ template inline decltype(auto) vreg(T* d, const EPosT& pos); - /****************** - * ConsecFunc * - ******************/ + /*================+ + | ConsecFunc | + +================*/ template constexpr decltype(auto) consecGet(const T& a); @@ -86,9 +86,9 @@ namespace CNORXZ template constexpr Dst& consecFuncA(const F& f, Dst& dst, const Args&... args); - /****************************** - * basic operations: plus * - ******************************/ + /*============================+ + | basic operations: plus | + +============================*/ template struct PlusCC @@ -133,9 +133,9 @@ namespace CNORXZ constexpr Consecutive& operator+=(Consecutive& o, const U& a) { return PlusCX::aeval(o,a); } - /******************************* - * basic operations: minus * - *******************************/ + /*=============================+ + | basic operations: minus | + +=============================*/ template struct MinusCC @@ -180,9 +180,9 @@ namespace CNORXZ constexpr Consecutive& operator-=(Consecutive& o, const U& a) { return MinusCX::eval(o,a); } - /*********************************** - * basic operations: muliplies * - ***********************************/ + /*=================================+ + | basic operations: muliplies | + +=================================*/ template struct MultipliesCC @@ -227,9 +227,9 @@ namespace CNORXZ constexpr Consecutive& operator*=(Consecutive& o, const U& a) { return MultipliesCX::eval(o,a); } - /********************************* - * basic operations: divides * - *********************************/ + /*===============================+ + | basic operations: divides | + +===============================*/ template struct DividesCC diff --git a/src/include/ranges/crange.cc.h b/src/include/ranges/crange.cc.h index 6a8e3be..843b90b 100644 --- a/src/include/ranges/crange.cc.h +++ b/src/include/ranges/crange.cc.h @@ -2,10 +2,9 @@ /** @file include/ranges/crange.cc.h - @brief ... + @brief CRange and CIndex template implementations. - - Copyright (c) 2022 Christian Zimmermann. All rights reserved. + Copyright (c) 2024 Christian Zimmermann. All rights reserved. Mail: chizeta@f3l.de **/ diff --git a/src/include/ranges/dindex.cc.h b/src/include/ranges/dindex.cc.h index f752bed..91668b6 100644 --- a/src/include/ranges/dindex.cc.h +++ b/src/include/ranges/dindex.cc.h @@ -2,8 +2,7 @@ /** @file include/ranges/dindex.cc.h - @brief ... - + @brief Dynamic index template implementations. Copyright (c) 2024 Christian Zimmermann. All rights reserved. Mail: chizeta@f3l.de diff --git a/src/include/ranges/dindex.h b/src/include/ranges/dindex.h index 82cab3c..f70a56c 100644 --- a/src/include/ranges/dindex.h +++ b/src/include/ranges/dindex.h @@ -2,7 +2,7 @@ /** @file include/ranges/dindex.h - @brief DIndex declaration. + @brief Dynamic index declaration. Copyright (c) 2024 Christian Zimmermann. All rights reserved. Mail: chizeta@f3l.de diff --git a/src/include/ranges/eindex.cc.h b/src/include/ranges/eindex.cc.h index e0c31c1..a48a8c3 100644 --- a/src/include/ranges/eindex.cc.h +++ b/src/include/ranges/eindex.cc.h @@ -2,10 +2,9 @@ /** @file include/ranges/eindex.cc.h - @brief ... + @brief Extension index implementations. - - Copyright (c) 2022 Christian Zimmermann. All rights reserved. + Copyright (c) 2024 Christian Zimmermann. All rights reserved. Mail: chizeta@f3l.de **/ diff --git a/src/include/ranges/eindex.h b/src/include/ranges/eindex.h index f7e2c81..a0e1e3e 100644 --- a/src/include/ranges/eindex.h +++ b/src/include/ranges/eindex.h @@ -2,8 +2,7 @@ /** @file include/ranges/eindex.h - @brief ... - + @brief Extension index declaration. Copyright (c) 2024 Christian Zimmermann. All rights reserved. Mail: chizeta@f3l.de diff --git a/src/include/ranges/index_base.cc.h b/src/include/ranges/index_base.cc.h index 4ba1774..c037b54 100644 --- a/src/include/ranges/index_base.cc.h +++ b/src/include/ranges/index_base.cc.h @@ -2,10 +2,9 @@ /** @file include/ranges/index_base.cc.h - @brief ... + @brief Index base template implementation. - - Copyright (c) 2022 Christian Zimmermann. All rights reserved. + Copyright (c) 2024 Christian Zimmermann. All rights reserved. Mail: chizeta@f3l.de **/ @@ -17,9 +16,9 @@ namespace CNORXZ { - /********************** - * IndexInterface * - **********************/ + /*====================+ + | IndexInterface | + +====================*/ template IndexInterface::IndexInterface() @@ -113,9 +112,9 @@ namespace CNORXZ } - /**************************** - * Non-member functions * - ****************************/ + /*==========================+ + | Non-member functions | + +==========================*/ template IndexPtr& operator++(const IndexPtr& i) diff --git a/src/include/ranges/index_base.h b/src/include/ranges/index_base.h index 4668af8..e9ca374 100644 --- a/src/include/ranges/index_base.h +++ b/src/include/ranges/index_base.h @@ -2,10 +2,9 @@ /** @file include/ranges/index_base.h - @brief ... + @brief Index base declaration. - - Copyright (c) 2022 Christian Zimmermann. All rights reserved. + Copyright (c) 2024 Christian Zimmermann. All rights reserved. Mail: chizeta@f3l.de **/ diff --git a/src/include/ranges/index_format.cc.h b/src/include/ranges/index_format.cc.h index b5fa845..7acf07c 100644 --- a/src/include/ranges/index_format.cc.h +++ b/src/include/ranges/index_format.cc.h @@ -2,10 +2,9 @@ /** @file include/ranges/index_format.cc.h - @brief ... + @brief Index formats implementations. - - Copyright (c) 2022 Christian Zimmermann. All rights reserved. + Copyright (c) 2024 Christian Zimmermann. All rights reserved. Mail: chizeta@f3l.de **/ @@ -17,9 +16,9 @@ namespace CNORXZ { - /*************** - * MFormat * - ***************/ + /*=============+ + | MFormat | + +=============*/ template constexpr MFormat::MFormat(const Arr& b) : @@ -61,9 +60,9 @@ namespace CNORXZ } - /**************** - * GMFormat * - ****************/ + /*==============+ + | GMFormat | + +==============*/ template constexpr GMFormat::GMFormat(const Tuple& b) : @@ -115,9 +114,9 @@ namespace CNORXZ return GMFormat(std::move(std::make_tuple(ps...))); } - /*************** - * YFormat * - ***************/ + /*=============+ + | YFormat | + +=============*/ template YFormat::YFormat(const FormatT& f) : mB(f.size()) diff --git a/src/include/ranges/index_mul.cc.h b/src/include/ranges/index_mul.cc.h index 0395560..dbc1e7a 100644 --- a/src/include/ranges/index_mul.cc.h +++ b/src/include/ranges/index_mul.cc.h @@ -2,8 +2,7 @@ /** @file include/ranges/index_mul.cc.h - @brief ... - + @brief Index multiplication template implementation. Copyright (c) 2022 Christian Zimmermann. All rights reserved. Mail: chizeta@f3l.de @@ -18,9 +17,9 @@ namespace CNORXZ { - /********************* - * MIndexSptrMul * - *********************/ + /*===================+ + | MIndexSptrMul | + +===================*/ template decltype(auto) MIndexSptrMul::evalMX(const Sptr>& a, @@ -52,9 +51,9 @@ namespace CNORXZ } - /***************** - * operator* * - *****************/ + /*===============+ + | operator* | + +===============*/ template inline decltype(auto) operator*(const IndexInterface& a, @@ -122,9 +121,9 @@ namespace CNORXZ return a.mul(b); } - /*************** - * iptrMul * - ***************/ + /*=============+ + | iptrMul | + +=============*/ template decltype(auto) iptrMul(const Sptr& a, const Sptr& b) diff --git a/src/include/ranges/index_pack.cc.h b/src/include/ranges/index_pack.cc.h index f8b05f5..c8be6aa 100644 --- a/src/include/ranges/index_pack.cc.h +++ b/src/include/ranges/index_pack.cc.h @@ -2,10 +2,9 @@ /** @file include/ranges/index_pack.cc.h - @brief ... + @brief Index pack template implementations. - - Copyright (c) 2022 Christian Zimmermann. All rights reserved. + Copyright (c) 2024 Christian Zimmermann. All rights reserved. Mail: chizeta@f3l.de **/ @@ -17,9 +16,9 @@ namespace CNORXZ { - /************* - * SPack * - *************/ + /*===========+ + | SPack | + +===========*/ template constexpr SPack::SPack(const Sptr&... is) : @@ -96,9 +95,9 @@ namespace CNORXZ return lex(); } - /************************** - * SPack (non-member) * - **************************/ + /*========================+ + | SPack (non-member) | + +========================*/ template constexpr decltype(auto) spack(const Indices&... inds) @@ -114,9 +113,9 @@ namespace CNORXZ return SPack( inds... ); } - /************* - * DPack * - *************/ + /*===========+ + | DPack | + +===========*/ template DPack::DPack(const SPack& p) : @@ -127,9 +126,9 @@ namespace CNORXZ {} - /************************** - * DPack (non-member) * - **************************/ + /*========================+ + | DPack (non-member) | + +========================*/ template DPack dpack(const Indices&... inds) diff --git a/src/include/ranges/lindex.cc.h b/src/include/ranges/lindex.cc.h index 4dc5dab..5ec5342 100644 --- a/src/include/ranges/lindex.cc.h +++ b/src/include/ranges/lindex.cc.h @@ -2,8 +2,7 @@ /** @file include/ranges/lindex.cc.h - @brief ... - + @brief LIndex implementations. Copyright (c) 2022 Christian Zimmermann. All rights reserved. Mail: chizeta@f3l.de diff --git a/src/include/ranges/range_base.cc.h b/src/include/ranges/range_base.cc.h index 779d871..d354056 100644 --- a/src/include/ranges/range_base.cc.h +++ b/src/include/ranges/range_base.cc.h @@ -2,10 +2,9 @@ /** @file include/ranges/range_base.cc.h - @brief ... + @brief RangeBase template implementations. - - Copyright (c) 2022 Christian Zimmermann. All rights reserved. + Copyright (c) 2024 Christian Zimmermann. All rights reserved. Mail: chizeta@f3l.de **/ diff --git a/src/include/ranges/ranges.cc.h b/src/include/ranges/ranges.cc.h index 9f4f18f..5110bca 100644 --- a/src/include/ranges/ranges.cc.h +++ b/src/include/ranges/ranges.cc.h @@ -2,10 +2,9 @@ /** @file include/ranges/ranges.cc.h - @brief ... + @brief Ranges template implementation main header - - Copyright (c) 2022 Christian Zimmermann. All rights reserved. + Copyright (c) 2024 Christian Zimmermann. All rights reserved. Mail: chizeta@f3l.de **/ diff --git a/src/include/ranges/srange.cc.h b/src/include/ranges/srange.cc.h index a5e9e55..7c9dfde 100644 --- a/src/include/ranges/srange.cc.h +++ b/src/include/ranges/srange.cc.h @@ -2,10 +2,9 @@ /** @file include/ranges/srange.cc.h - @brief ... + @brief SRange, SRangeFactory and SIndex implementation. - - Copyright (c) 2022 Christian Zimmermann. All rights reserved. + Copyright (c) 2024 Christian Zimmermann. All rights reserved. Mail: chizeta@f3l.de **/ @@ -18,9 +17,9 @@ namespace CNORXZ { - /************** - * SIndex * - **************/ + /*============+ + | SIndex | + +============*/ template SIndex::SIndex(const RangePtr& range, SizeT pos) : @@ -213,9 +212,9 @@ namespace CNORXZ } - /********************* - * SRangeFactory * - *********************/ + /*===================+ + | SRangeFactory | + +===================*/ template SRangeFactory::SRangeFactory(const Arr& space) : @@ -248,9 +247,9 @@ namespace CNORXZ } } - /************** - * SRange * - **************/ + /*============+ + | SRange | + +============*/ template SRange::SRange(const Arr& space) : @@ -338,9 +337,9 @@ namespace CNORXZ return Vector { this->id() }; } - /******************* - * Range Casts * - *******************/ + /*=================+ + | Range Casts | + +=================*/ template Sptr> RangeCast>::func(const RangePtr& r) diff --git a/src/include/ranges/urange.cc.h b/src/include/ranges/urange.cc.h index 603d096..7b868b5 100644 --- a/src/include/ranges/urange.cc.h +++ b/src/include/ranges/urange.cc.h @@ -2,10 +2,9 @@ /** @file include/ranges/urange.cc.h - @brief ... + @brief URange, URangeFactory and UIndex implementations. - - Copyright (c) 2022 Christian Zimmermann. All rights reserved. + Copyright (c) 2024 Christian Zimmermann. All rights reserved. Mail: chizeta@f3l.de **/ @@ -25,9 +24,9 @@ namespace CNORXZ { - /***************** - * UIndex * - *****************/ + /*===============+ + | UIndex | + +===============*/ template UIndex::UIndex(const RangePtr& range, SizeT pos) : @@ -222,9 +221,9 @@ namespace CNORXZ return iptrMul(a, b); } - /********************** - * URangeFactory * - **********************/ + /*====================+ + | URangeFactory | + +====================*/ template URangeFactory::URangeFactory(const Vector& space) : @@ -257,9 +256,9 @@ namespace CNORXZ } } - /*************** - * URange * - ***************/ + /*=============+ + | URange | + +=============*/ template URange::URange(const Vector& space) : @@ -350,9 +349,9 @@ namespace CNORXZ return Vector { this->id() }; } - /******************* - * Range Casts * - *******************/ + /*=================+ + | Range Casts | + +=================*/ template struct URangeCast diff --git a/src/include/ranges/xindex.cc.h b/src/include/ranges/xindex.cc.h index ff5db88..f72e7c2 100644 --- a/src/include/ranges/xindex.cc.h +++ b/src/include/ranges/xindex.cc.h @@ -2,10 +2,9 @@ /** @file include/ranges/xindex.cc.h - @brief ... + @brief XIndexBase and XIndex template implementations. - - Copyright (c) 2022 Christian Zimmermann. All rights reserved. + Copyright (c) 2024 Christian Zimmermann. All rights reserved. Mail: chizeta@f3l.de **/ @@ -18,9 +17,9 @@ namespace CNORXZ { - /************** - * XIndex * - **************/ + /*============+ + | XIndex | + +============*/ template XIndex::XIndex(const IndexPtr& i) : diff --git a/src/include/xpr/for.cc.h b/src/include/xpr/for.cc.h index ba6a07e..5b95eb5 100644 --- a/src/include/xpr/for.cc.h +++ b/src/include/xpr/for.cc.h @@ -19,9 +19,9 @@ namespace CNORXZ { - /*********** - * For * - ***********/ + /*=========+ + | For | + +=========*/ template constexpr For::For(SizeT size, const IndexId& id, const Xpr& xpr, F&& f) : @@ -83,9 +83,9 @@ namespace CNORXZ return mXpr.rootSteps(id); } - /************************ - * For (non-member) * - ************************/ + /*======================+ + | For (non-member) | + +======================*/ template constexpr decltype(auto) mkFor(SizeT size, const IndexId& id, const Xpr& xpr, F&& f) @@ -99,9 +99,9 @@ namespace CNORXZ return For(size, id, xpr, NoF {}); } - /************ - * SFor * - ************/ + /*==========+ + | SFor | + +==========*/ template constexpr SFor::SFor(const IndexId& id, const Xpr& xpr, F&& f) : @@ -203,9 +203,9 @@ namespace CNORXZ return; } - /************************* - * SFor (non-member) * - *************************/ + /*=======================+ + | SFor (non-member) | + +=======================*/ template constexpr decltype(auto) mkSFor(const IndexId& id, const Xpr& xpr, F&& f) @@ -219,9 +219,9 @@ namespace CNORXZ return SFor(id, xpr, NoF {}); } - /************ - * PFor * - ************/ + /*==========+ + | PFor | + +==========*/ template constexpr PFor::PFor(SizeT size, const IndexId& id1, const IndexId& id2, @@ -291,9 +291,9 @@ namespace CNORXZ return mXpr.rootSteps(id); } - /************************* - * PFor (non-member) * - *************************/ + /*=======================+ + | PFor (non-member) | + +=======================*/ template constexpr decltype(auto) mkPFor(SizeT size, const IndexId& id1, const IndexId& id2, @@ -309,9 +309,9 @@ namespace CNORXZ return PFor(size, id1, id2, xpr, NoF {}); } - /************ - * TFor * - ************/ + /*==========+ + | TFor | + +==========*/ template constexpr TFor::TFor(SizeT size, const IndexId& id, const Xpr& xpr, F&& f) : @@ -399,9 +399,9 @@ namespace CNORXZ } - /************ - * EFor * - ************/ + /*==========+ + | EFor | + +==========*/ template constexpr EFor::EFor(const IndexId& id, const Xpr& xpr, F&& f) : diff --git a/src/include/xpr/pos_type.cc.h b/src/include/xpr/pos_type.cc.h index f4ade10..7fead30 100644 --- a/src/include/xpr/pos_type.cc.h +++ b/src/include/xpr/pos_type.cc.h @@ -18,9 +18,9 @@ namespace CNORXZ { - /************ - * SPos * - ************/ + /*==========+ + | SPos | + +==========*/ template constexpr SizeT SPos::size() const @@ -116,9 +116,9 @@ namespace CNORXZ return val(); } - /************ - * UPos * - ************/ + /*==========+ + | UPos | + +==========*/ constexpr UPos::UPos(SizeT ext) : mExt(ext) {} @@ -183,9 +183,9 @@ namespace CNORXZ return val(); } - /************ - * FPos * - ************/ + /*==========+ + | FPos | + +==========*/ inline FPos::FPos(SizeT ext, const SizeT* map) : mExt(ext), mMap(map) {} @@ -234,9 +234,9 @@ namespace CNORXZ return val(); } - /************* - * SFPos * - *************/ + /*===========+ + | SFPos | + +===========*/ template Arr SFPos::sMs = { Ms... }; @@ -320,9 +320,9 @@ namespace CNORXZ return val(); } - /************ - * MPos * - ************/ + /*==========+ + | MPos | + +==========*/ template constexpr MPos::MPos() @@ -411,9 +411,9 @@ namespace CNORXZ return extend(a); } - /************ - * DPos * - ************/ + /*==========+ + | DPos | + +==========*/ inline DPos::DPos(Uptr&& a) : ObjHandle(std::forward>(a)) @@ -516,9 +516,9 @@ namespace CNORXZ return val(); } - /*************** - * DPosRef * - ***************/ + /*=============+ + | DPosRef | + +=============*/ inline DPosRef::DPosRef(const VPosBase* p) : mP(p) {} @@ -597,9 +597,9 @@ namespace CNORXZ return val(); } - /************ - * EPos * - ************/ + /*==========+ + | EPos | + +==========*/ template constexpr EPos::EPos(const BPosT& b, const OPosTs&... os) : @@ -689,9 +689,9 @@ namespace CNORXZ return OEPosT(BPosT::next(), std::get(mP).next()...); } - /********************************* - * Traits and Helper-Classes * - *********************************/ + /*===============================+ + | Traits and Helper-Classes | + +===============================*/ template decltype(auto) MkEPos::mk(const BPosT& a, const OPosT& b) diff --git a/src/include/xpr/pos_type.h b/src/include/xpr/pos_type.h index 1817726..09f300e 100644 --- a/src/include/xpr/pos_type.h +++ b/src/include/xpr/pos_type.h @@ -306,9 +306,9 @@ namespace CNORXZ constexpr decltype(auto) get() const; }; - /********************************* - * Traits and Helper-Classes * - *********************************/ + /*===============================+ + | Traits and Helper-Classes | + +===============================*/ template struct is_pos_type { CXZ_CVAL_FALSE; }; @@ -380,9 +380,9 @@ namespace CNORXZ template decltype(auto) mkiEPos(const BPosT& a, const OPosT& b, std::index_sequence is); - /************************************************** - * Traits and Helper-Classes: Specializations * - **************************************************/ + /*================================================+ + | Traits and Helper-Classes: Specializations | + +================================================*/ template struct is_pos_type> { CXZ_CVAL_TRUE; }; template struct is_scalar_pos_type> { CXZ_CVAL_TRUE; }; diff --git a/src/include/xpr/vpos_type.cc.h b/src/include/xpr/vpos_type.cc.h index 4df2dc1..bb80df1 100644 --- a/src/include/xpr/vpos_type.cc.h +++ b/src/include/xpr/vpos_type.cc.h @@ -17,9 +17,9 @@ namespace CNORXZ { - /************ - * VPos * - ************/ + /*==========+ + | VPos | + +==========*/ template VPos::VPos(const PosT& a) : @@ -77,9 +77,9 @@ namespace CNORXZ return std::make_unique>( (*this)(UPos(a->vval())) ); } - /****************** - * VPos * - ******************/ + /*================+ + | VPos | + +================*/ template VPos>::VPos(const VPos& a) : @@ -168,9 +168,9 @@ namespace CNORXZ return std::make_unique>( (*this)(UPos(a->vval())) ); } - /*************** - * VPosRef * - ***************/ + /*=============+ + | VPosRef | + +=============*/ template VPosRef::VPosRef(const PosT* c) : @@ -228,9 +228,9 @@ namespace CNORXZ return std::make_unique>( (*mC)(UPos(a->vval())) ); } - /********************* - * VPosRef * - *********************/ + /*===================+ + | VPosRef | + +===================*/ template VPosRef>::VPosRef(const MPos* c) : @@ -298,9 +298,9 @@ namespace CNORXZ return std::make_unique>( (*mC)(UPos(a->vval())) ); } - /******************* - * PosFromVPos * - *******************/ + /*=================+ + | PosFromVPos | + +=================*/ template inline decltype(auto) PosFromVPos::make(const VPosBase* a) diff --git a/src/include/xpr/xpr_base.cc.h b/src/include/xpr/xpr_base.cc.h index 43fdf6c..f51afa2 100644 --- a/src/include/xpr/xpr_base.cc.h +++ b/src/include/xpr/xpr_base.cc.h @@ -17,9 +17,9 @@ namespace CNORXZ { - /************ - * VXpr * - ************/ + /*==========+ + | VXpr | + +==========*/ template VXpr::VXpr(const XprInterface& a) : @@ -50,9 +50,9 @@ namespace CNORXZ return DPos(this->rootSteps(id)); } - /************ - * DXpr * - ************/ + /*==========+ + | DXpr | + +==========*/ template template diff --git a/src/lib/ranges/range_base.cc b/src/lib/ranges/range_base.cc index 749c5f7..eb20116 100644 --- a/src/lib/ranges/range_base.cc +++ b/src/lib/ranges/range_base.cc @@ -15,9 +15,9 @@ namespace CNORXZ { - /************************* - * RangeFactoryBase * - *************************/ + /*=======================+ + | RangeFactoryBase | + +=======================*/ Map,RangePtr>> RangeFactoryBase::sCreated; @@ -56,9 +56,9 @@ namespace CNORXZ return rx; } - /****************** - * RangeBase * - ******************/ + /*================+ + | RangeBase | + +================*/ RangeBase::RangeBase() { @@ -101,9 +101,9 @@ namespace CNORXZ return this->index(this->size()); } - /**************************** - * Non-member functions * - ****************************/ + /*==========================+ + | Non-member functions | + +==========================*/ RangePack::operator RangePtr() const { diff --git a/src/lib/ranges/yrange.cc b/src/lib/ranges/yrange.cc index 0f799b9..4a4ac16 100644 --- a/src/lib/ranges/yrange.cc +++ b/src/lib/ranges/yrange.cc @@ -14,9 +14,9 @@ namespace CNORXZ { - /************************* - * YIndex (private) * - *************************/ + /*=======================+ + | YIndex (private) | + +=======================*/ inline DPack YIndex::mkIndices() const { @@ -130,9 +130,9 @@ namespace CNORXZ } - /*************** - * YIndex * - ***************/ + /*=============+ + | YIndex | + +=============*/ YIndex::YIndex(const YIndex& i) : IndexInterface>(i), @@ -517,9 +517,9 @@ namespace CNORXZ } - /**************************** - * non-member functions * - ****************************/ + /*==========================+ + | non-member functions | + +==========================*/ YIndex yindex(const DPack& pack) { @@ -541,9 +541,9 @@ namespace CNORXZ return std::make_shared(is); } - /********************** - * YRangeFactory * - **********************/ + /*====================+ + | YRangeFactory | + +====================*/ YRangeFactory::YRangeFactory(const Vector& rvec) : mRVec(rvec) {} @@ -570,9 +570,9 @@ namespace CNORXZ } } - /*************** - * YRange * - ***************/ + /*=============+ + | YRange | + +=============*/ RangePtr YRange::sub(SizeT i) const { @@ -659,18 +659,18 @@ namespace CNORXZ YRange::YRange(Vector&& rvec) : mRVec(std::forward>(rvec)) {} - /**************************** - * non-member functions * - ****************************/ + /*==========================+ + | non-member functions | + +==========================*/ RangePtr yrange(const Vector& rs) { return YRangeFactory(rs).create(); } - /******************* - * Range Casts * - *******************/ + /*=================+ + | Range Casts | + +=================*/ Sptr RangeCast::func(const RangePtr& r) { diff --git a/src/opt/cereal/include/cer_ranges.cc.h b/src/opt/cereal/include/cer_ranges.cc.h index 7180e99..4f23494 100644 --- a/src/opt/cereal/include/cer_ranges.cc.h +++ b/src/opt/cereal/include/cer_ranges.cc.h @@ -22,9 +22,9 @@ namespace CNORXZ { - /************** - * save * - **************/ + /*============+ + | save | + +============*/ template void save(Archive& ar, const Uuid& id) @@ -61,9 +61,9 @@ namespace CNORXZ ar(cereal::make_nvp("sub", mRVec)); } - /************** - * load * - **************/ + /*============+ + | load | + +============*/ template void load(Archive& ar, Uuid& id) From b20de211ef83d4fa7d49d886ba2457c84ffe0baf Mon Sep 17 00:00:00 2001 From: Christian Zimmermann Date: Sat, 3 Feb 2024 23:35:29 +0100 Subject: [PATCH 6/9] remove some code that has been already commented out --- src/include/array/array_base.cc.h | 2 -- src/opt/hdf5/include/h5_dataset.cc.h | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/include/array/array_base.cc.h b/src/include/array/array_base.cc.h index cd71cdf..dcc1779 100644 --- a/src/include/array/array_base.cc.h +++ b/src/include/array/array_base.cc.h @@ -181,7 +181,6 @@ namespace CNORXZ typename CArrayBase::const_iterator CArrayBase::itLexSave(const Acc& acc) const { CXZ_ASSERT(acc.lex() < this->size(), "index out of range"); - //CXZ_ASSERT(false, "IMPLEMENT CHECKS!!"); // check further compatibility of index/range format!!! return begin() + acc.lex(); } @@ -374,7 +373,6 @@ namespace CNORXZ typename ArrayBase::iterator ArrayBase::itLexSave(const Acc& acc) { CXZ_ASSERT(acc.lex() < this->size(), "index out of range"); - //CXZ_ASSERT(false, "IMPLEMENT CHECKS!!"); // check further compatibility of index/range format!!! return begin() + acc.lex(); } diff --git a/src/opt/hdf5/include/h5_dataset.cc.h b/src/opt/hdf5/include/h5_dataset.cc.h index 9c4aaeb..5ce17ea 100644 --- a/src/opt/hdf5/include/h5_dataset.cc.h +++ b/src/opt/hdf5/include/h5_dataset.cc.h @@ -34,7 +34,7 @@ namespace CNORXZ H5Sclose(memspace); } else { - CXZ_ERROR("IMPLEMENT!!!"); + CXZ_ERROR("Got array type with non-trivial format; non-contiguous data formats are not supported yet!"); } return *this; } From be312c31bb1068bcab3227332dfa2e7383bcd8ed Mon Sep 17 00:00:00 2001 From: Christian Zimmermann Date: Sat, 3 Feb 2024 23:55:54 +0100 Subject: [PATCH 7/9] readme minor changes... --- README.md | 2 +- cnorxz_logo.png | Bin 45556 -> 45587 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3ff29bd..4cc1039 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ ## Description -This library provides a framework for handling multi dimensional containers, their meta data, and several kinds of operations on one or more of them. +This library provides a framework for handling multi dimensional data containers (arrays or array-like types), their meta data, and several kinds of operations on one or more of them. ## Build instructions diff --git a/cnorxz_logo.png b/cnorxz_logo.png index 757ce6c4e75260d70d91e44c7d568ffe789ef775..008dbeb19aed0f2c90598789afeb3b5460820e80 100644 GIT binary patch literal 45587 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 literal 45556 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

BFp z&KIPr5qSQn5<#_$5#%%}I0Ng+9{^%+yFWh%Fx|PW)Qs4cR#6WBCVY*{2bhnJFoVI8 zgb>~3t@X`<$U?WkmS}_*I=~OZ_1CXKp-tV%2nvSlU(^@sMkUbVIbM4d+vZoA+w;jO z(927#-ub-2GUg**THSJLk|DK9FJ=VmN^{BtcVR!wILXfrIp@DG4$Wg%_voQQ*eH6! zyDqWIK@1h$X$_1aLs91{BV+eun8*9_fiv!2@ZA>oVjYa)>6w; zqbSKe>Dx3RZ0=k9YF?z60iQx-<%hO`U7K=wRzfzPpT!5|NYPrqWcKw6_UeKBr;fkT zyi0{R)UJrq+_jS&$elbN0M;E4xE*0o4)z3?Q?;VB zI|>m(+B_?)(DmEgX(Mac6xy~NmMX5uhyYPZL0_lO#B2+94E==I7CTIsS#s`);u&_H z-g-=qBz|^X_Atxrm-eg<(0!SkZY~%nN#9-#?pf#5gB8^gCL1ANG#37)LIeg1F%G5K z<(CgWEVh_)9F5p61r7Be)G*D1??|8ssP*tY-7a-vjToKK+Xb*9LUXz?fH%&%N95mB zv5zQlQWp=$?)lx~zDiu1&M1Wn2t3jg7zn8IpS9b&e)nz;joQuFZZ;*Z*tdOmI*q_t zHr(=V!KzP%Tfd}gHM(oRNv_QL^kK348mNs}tE*|wx`hE|mdu8gYO^vdjM+fC&g4t()6cr&xZRh7XRaD69Px zGOfRAV-*Q>LR+D|>FoySt+xcpkH9T!L3@bR#V zKhtRc_tWA+KjH+(;<36E_SfM!R72S+gMM3IGTQ*N3d$@*!mr=7J-#L-Ij(1!rP1va zNOEtUY}d-ekiReg5tmrIu{)}r2z8fCo<&f(q-Vjgz{IYb6b$7QVsMeuA5T2hkrC1tMbvK8JDwUT|A0IT zbTdAG^Mr(PJyx_A3S>6O&9Ue%@gF)ht}+0^OW-`oXF%rml{67k^XQ<^;v*Ate$)FYvH)OScV-0Go!b+&XLlivQ9jJFBcBn5dlL zPFtyWQzTfjnvC*B^`=80LP|&Rj_WOdmDZn;M+zyrqSHn6Qo=?9s#OlxPQy4V0CYIg zutcAI`7>hGtPPGN{T&Z^qo{Ll9NC1!5mbYEhaIay_fi!5ckChVkpfX-diCK)iLZ|k z`Y_H|VoETfrohbN1N*0pHWQWL$T?!>bmgHer~4vXaEAE&sWAV;${+zB3OZ0tH=dAJ z(QcoHrMqL8X8k#>0GR&y-qZGHQhR0L4p9oxCW0&UCz7#V6jBb~4vH@u+z12AB0b}~ ztLnJ`!}L37Y<~ESwctgTZ#uf6SkyCFV>@L?Wj%gdg4$_qo&izT;)kuLJGLdo>ch93 z5=Wt9Gjt!`Xq;QF*(Q4WX+5!o16mh}N7F&xyDw34rq(?ktU!reslV?``>|^OW9xBW z9y-|RxXxGEkeiKE6-TW8>Kp5*Gjtsy{=-P}M0|oV95FIo4~#a?6go!wwbSU_M=K;IUn3|6kW&lZ7rn0aM!P9Qd&! z)^kTr#LHs+ajYYZKxBHFY0Jl(gVN4ib%h-l1yw%Sxv{7;;Cg{Y3^tE<_nkJKniwP+ zRUC#QmAexJyOa5X+W3aYmLdT}5I6VZ*(p^P|oA(bA-v#jvXqrYodex{9^GlqON=&EBXY7e!Ru zm}A*`l=Fh#X`E4DhuXlI6=2AnCw{p9ghQDj^dcrdV!I?8ackR`%TIFK>p?G}ej6iEjtDP82}amWUF~+B7F>&`$Kb;t*EI{ACn`RX3(9f z(c*I>y4H}>x!ZVN#%9!?9vJ|B>r6!;#nIoP2{nFJ8tX+GUWw88oaPIzDk$MBK`^nmxINt*nvu<9`$E8@D}k9M~gf}P*Mn;R@Nb@UNVo(Zik9(Iqp zpOO^FEJ{W7>KH2@VjV!h%;6z_x?`3lopz8hLskj~xz{!zIj+_h8 z>;W~*@6@dihpiLyr;}W-Y*HM*+uc!2vr8i33`gM`Aia;8tHuv*M&i;-2+!3X;0wurHGad6N?eZSwu$|s}7yIRtgFng? z+e%Q~~D|ANN0~1Ho%AyX@2P zcSuL5W=H5Wt2~mLRRMFoVN}42+Eox60qm-tt}uc`i&5b|a{KK}K>3cf#!;-nbh@U1 zZ}tfJ`pv)F1V!FZ!xjWWnt2wW!UCV=8n7tYH0m1~-1h+_J#FX8{|F8}kB^7@q-ezm zphl?Wy|N;U#CGrV3s-b8UzT^_DHQ!XKmHC6_u}mGiu%?aJ^16kRbO#r&s-z2{NS#u zI@7TtA$q}&$`8~eD2Bqd>OstErJCXUk_d5y$riIj;F=7IELn{yibiZ9vCE?CF*^C- z=FL}~`wz%foxcGER3(++=q{s+p@gGCiQ$`_U)_f1Z%*0&>6}Jb5b?xV=vvhhvb&(c zC_%M~7N(QE?YF+Jlqlf*Ujg!hXduu5;Z@Nz!!!Nk;uMBG0a4iX?GQyF!(r+ch*wTv%9zUOMWJr8U?uvZu3Hai zPcE}mYX}WRX5=|HV*I;FmFYFm$F?AWabQ5u%hcba2z7o|>_2@a)8`ikiJ}$!q&e9i znyS?Of;>X}Ulm5`!dWvU45`yW{G{uQMapNra{A`$j)ce<@ZsR>}oAxMRlRF%WpSd19UWDS|5B1`Kc$|R& zIt8E5=ipsu+Ch)RAd4KQ&>a^pF4ilZeXxX4<*91kdq0X8ilO{7+9ULnflpzS4ll%% z0`s@R#h9uc{$)@9MlU!+295KEeA%SJD0;G*xAd3$l#owMSI2E_k0^drEIc(T$l-X z(CP(S$xXup>R9WL=&T}T!7OLhaWV(F^ss>(zjJ40w9w<9^gVC^T zWk^i{?q5_j3vri^3#f#QJd37Gv~F5afI#G~VV1B#GZ>D1XiUuH05jU=i>I>*1V9CJ zKo~H~`lnd!2vFt4DivXOPBKeAr}D8X&;w{R$DT9)D46JN;Fo*Zr|IL*bnxk~BIJPb z3f(YcNv}a2*mpx@a*YpB8*J~^TR80w^uW@6P*wO!7;3(?dwTIAQM%Z}O(w(<8A9FZS}C((GP+fpceywFk}`lp}t_X7%g&)W2x^Pi8|$ zHX$HdPSdER;L(CEnrNGffF&|^CxkNng2Q3L^XCCOro}?jb=Jcx3@`G}{^nxW&Wh}< zTl~vAEvcViBf{1I8F0eZu77F?8AiC|{IacJUF7GjQ^wk|J0zTQGQunmwi&lX$@lR) z0X;58up9Th(ja{_uE@46t(*HG6E4Ix?(;HYT!u+N^djMbONh+6X`%=3_0e0sR9X1dN@y zJ9&R+SfNMv(-pkuvimPV;HO{qXA^x{$H2XjbzI+rciiZ!3VnXBj^OSR)>u3q&AF)y zPO_TuFNlQEv^-hr9T>FbIh_^h0WBPWU3?q%MH?|b04F{^UPT5TAPhX3DpnT*)Kx^Z zZwB|@w5o-#1Zqg`RddR^z22MBkCR1U)P}Ky?ufj6`snQ8yw(*nDpB+1^Pqms<#o3| z+;dRR+E)E~lK?-f3=mbD-thaD?!>Op75x87hIS8JlIi_F@%ZEyF+!74SQ9;Nry{(C z2RY;w@;Ce)D=eNmALV$d)eiMKpKJ@P;hy!Nw%By`Pl?KxdR4PwpZv}H`MYXIGU`v1 zlPE3?k5c&zghK?-Kg`+v0b~Fq?8)3deqUlf5DORCy_RiM(TM5}mzxNs_@Ky&ic-+F zNA{ikUQ%p`>Z`}k)}Gxpe{;TmkqFepZ)LxbuGhG}@@Sy^#OvO;pjkh6i}_X)1L$Ov zp&x>A+^s(%OuufD-$&@(wXe6(Cw2KT@-Q))5FQ$@JW47%%Sv;w3-LNfUqd-l!ib}N ziz~#b&4Wrp5`mQvOhlyB*x5NW)pxYjdp7ntsgtn?aOXu;Yx7(5=ebLX^|Q`T*@bj| z$+1IH5Y_wsce-(aN;Ejvkk=4FS?fg3+!6G8Iddo@LQ@co!XkiTlCXYsGQl8`ccVoC zUJNS{l`skB=16B%ho|rXXC^?j5(CwfUQea(&rC(wEkchZ0Kdk&_V0oP+be1IFs1%= zn3qX)){PtMipLSZYP{YX?~TtVe+fiMJ5}HonKW6&e{GbaMx8>;ql81Z9P2s}1hgW4 zI(o=5oqSP_{{%G^i2D{EHvS`aR$l;E;*}okzej#Rsw2H9p?Q!A`OZlf2sIBGBI#xc z?@)}91n2GJ#MZFkT3rgh&3bSneR=#Vz%f1#SqQ)D9Q*+#OR@?aa`=P`+5|4P@GR$b zSAK-YPQBC>;15i-)qI(JG}UKz>%S0mK&s;u?Vhn|JY`+|v0Mq$ws2DqyAUq4S?MgKSn0Ke4j_-cDa!*S!W`9X|_tb%}+Fv=c$Ht{1VUMC^pHj%v*OZM?lsb3~@JoS)@`qlJo2H0(j&GCplXo=;O~ zOMnU#y{&Y@FF7bp!aKGaESyy#iyVAHgqvomxcwjQLlmDz|4*oWAoye8#as1MMDm11 z)TxUT@ZJ&GemYoUDE5hzIp>SIK=6-q+jSpPKT44jB4zE@rAY8G)FO_t%U`gz zXW&Cc0e7aAJ4oGnX^AX(uzpnY$NF*+JFBN%VEC6%WpWW{js+KfqnRsBsg==0p*xee z;HC)ACSxA=x2&zOrPcu5DDg1q0l8d2gu_^IX>&B*7)PnHIB$R9KyfpKmE+1Dx~og` zMg>od5S@~5(9Q29CdLLs$<3X0Q&n6tcZNI;m1&Jj?^QCUcC)bk)qV>G&%F^SbkT93 z`Ssx(NvzPTwysSjj+XrL8%7#+JOI|={L|B$E=YQQoE|!H=<9p)?py^7l$&iWC29M9 zYa+1u>{%TS_gAZSYrMc`r%$OhBili~bm7tST1rfa9d=wwKdTIwI?$3q04~KvM1(my zy-BBI#p@_W#CJ^VYq68U46KGCpmfzLS(p#^H-wV%7>=Q$plO|kc8I`@f5%zkDQ9{R zz5$=TfEN-*r);=H-iq=!D>Q>*#5%iQouPE~h*=`mueV@GI|PZiS&>M2aag(^z35Oz z8PfKsv9PS352n>r_&Wr<9}iD)bQM%z!oUGEKAJ5bkjVsWMtSCxJP6S``oJvUKrcK9 zW3jQaD(1LM7-v~8(Lx;uG9lGJNt=M`Cb`XVl8diqBRLAP_dzL9j3%EMFe8#`7BgHkuh;ll!&dGPk{%Z`fx&-zQ3t{x^!M7$LF z+gFz}^}{#XlirbrfK;DmzOdjptEzBIY#E)cPhw)xsqb;|qs0KhObGA0WcO;tl`<+f z=Q8ybzTZIof~(@St)9SeTw%-#wN&_VU)Ks`HQBYOYpf|wFBDpmaApZf^;c>6=+yud zurQtO=i`31;}YE*oWzZnRUy1*Lv+agspOL(U2(KP?#0b)ya9hV+uO3aG)%n%Ev2>V z*i9|L2oO_}`VR!<(^zUDRC@1Ojt_@p{OTc5r4bHKET~xc-qYVr5mNE!H@{DASX`tO zJ)4LfHs!lD$?EErG$V=NQZQnba!l0x29P!aMK-1 zhjjesKF@o-pU#(aE;y{U<{aZ5_x&5!jV}a76QtG&gZEztUn=4*)Gfjr!Tbg~XKqgA&nB z+5$5Qm~C9%^)pns?s31Nv=GT7mQQxII`YfC5WdzOH+`F9zZ5lK2>RlIwRdgDPXxyv z;xWvvA_TQMat7O#-x!Hij|K+*T}f7Ve_8ag&oz>|lY{LYUe!KK%UvW{(qC3)oQ{SIxx8bTBKZmY zscjqj5Ps3)URKN9vk|-(-V!nn)u_W6J}E)Qz}FICuG(8WDMCK+>puJ9jxHKqf5*{n z(H=AtS*eGS-@01$C9ZRQA2H~1LiZ7{kuxs)m>Q=dJ**W!B=ZRC<3>LhyYInMKK}=d zT^h=FyW!)4d9nr6l6W=aooMW>tKD~xkOk%W*c-7x;rw`|`B0B!_{*73s>p|7L0F`! zo|7Rn@BQL5vM+;=sl$JL zz$o!g;=FEH^Cs6e83hdeW|sV%A6=Wu_sVI6cE905y4`81^&P5v{JacgeFBkBK+2$t z4?bQ_usrhhcO-&LWW>7#E--s%jXQw0 zD1CSGW58>Q@v_f`SSTOO%Sp8}xP6`J7Z(EL({WO6&3M%WNu57s3Qu06uJF?3pTDby zX|7Y?Z@{Vj5ds(19iy1JyS9)SrP{Y;O*Kd~<)CLFv+_eO)r>5TbvrGX4XK^|WG!Q3 z4BjZrzsO^-JRApPM+16ePBi~;s7$`+WEg#2tLS4fJ~aK3qEEfyzZ`J z4eJaMW=r$Ko9J@e1rJ7@X!gRoKL86gGZrrOTA&M?Amz8c5IkGEjX4~ zQ@18NUT2gm*I}1>vQr9_thO~@auA0coV}pN0?nFXM);&JC-bPrfWk8hX06EqXlw6^ zZC~50DTkM!J4P?m(?dF%`=F?8|0HN5ex3^rpBe-o0K8&Q{;`sCak~Zq;48fA#tE$^ z_+QQI8!76Sg%&s)n|sn5?Tl@v{pg>|h zHVJ1<!jKCY_$kWE$1pQ3Zwm>Tz6vpsGxO1$4-3zm7=*&RClz_!JwBgr^5 zy+JwCCg7w%?;h3Sj;e+?Gec zEb`Iz4>EV@<7pHJj&p4U{TSEtGA~mPUfQC<0 z3_)c-^!8g&I~iI{-q-ssQwqV<^3$R#9~abR6Y=#I0_nX@BN0t>y9gCEIq5&}tbm^! zmUnHHMloqn^hL^67YVj|pc5TnA_LL`1KXv3+mHv5?&LyI~><$8t+#i<3Ah@Pv ziJC114~g=0aCu8ifb|gn4E;U>DH!|j7E3WMaq?np`v|Imq>X7a`?emWHLA0!S7Js* z0(+hC%IY5cWC~1b<=d-NRIE#_KWNZYi`gS(CtD=C9p^(AsJn=S5sfM=+ z#lX6Scv(6h?S_vudlv6u0oCI5fm-efB#?cLJj5V6;}cx3k8u0m8E|kTm>5$X?WFDf@SyKFBR^me+fuT=+02a^ z1mnVW)?ap}%q}A*J`8&r>YB_fDUeCr=vtF>i@YXSN=yX^U;XW50Y)pKbNVz+8LU7a zFgoVz-q_hVq6|Uk`9c*yLDdn6xskL3NT9C4x)UA+x`SNA!!SP2SkG>rE_A!9B1|vIx5;?RZ!>Y!#R( zUZQ?!5p?$y*4}C1z4GJReSTkY;bn3g?Z`?78&!oZJORhK*@#2W`SwYJ7aZKnFt|E? zZa&YD_me`4K|mQtY1!_lMhwPLJn?xYfo=MjU>&mko@+xxp^DUtl7kR;-by_6mJ%hmFD1*?3gl_?s+|!=YTXfcfMv?GwMll!7yO*i;KJd$a)%Bbp3-x%j#`a7O2oBUM!#;|^Jq?=@g_pZGKiWgE%U!%KwzmS z%~^D%it%+vg~P24H>5$Hd~bGm{t_kj!TbkpJv|d%SLZfVI(?m4Wy=5X>-C8&FX)tc zeLuR~m2k=Z>tXdcRazy#b~_$H^8sR17&z?-C>^^<-c(LVax(0dT^4xgQ!mjjY?oL! zp)YATJOgQgH?6C^;J*VV9H8%ejeZfV=&DOcSuM+X3S^Bzww+9dn!84r!c$c@;dqRm z6cuixR7WtoPOC_^W1VXz?O#4{4NoPus`?qn?mXhNI-lx}nV39gIx><0hQo-py(Hx- zCZK{~=tn(!iX3M!l?(l>ihMAcW@b3+s6hW(}BFLH?jrs+Y@$)hI9XRAm7yEx{@kxts6OTrR^J| zxoiyw$Dht7Jwd&Xx9;H|Da1Tq^Z4@1aD`AVT%Po+`<(E&-n0kqnj4pT?JAmD2QVJI z*6VKvQG%qYQ>-uqBt>63S8aY{~{%G#q z510OinZ}NXhMgLR;qY)DQ3S z;3Fqa7ET2sSWfAkP)DX0Ylr$Z?eb#(Ezn&4>V!O9w1*bN%Z+V|{j$UI@I_Z3T`2=|jJPoR-HR_8mP4`;I+ z%xpVASe0}wb(EB9rQ};g@m0F1;D#8+s=4GwLdyPu@ai8pDM&M?u)UOGE+Ln*_Y>GiU83XDW zj%kXc-OkWil{Tywf4vDvKkz5}565Sx2@i6&=o<^zBbabazyG<~JU!5( zA{O+|%DhAFjg4i<`K(E4T#az-DOS)-iR|@jqMPV-qjudCk#3grOJJiXn33Zke;1sK zdd*RT1fC7ZaMLIc^1*4{34A>qlRTBACo%HAfB4~$f~?lrgwl?dzVp?wziG*Xjm;^O zP?O&RMri?h*hS<~>Y;ZcCP2$ngavF~yk!1_RI-p3macrG^^_$2%eZ7>P%ZlKI77LB)zMoSGFFrl7#uTVZ%=G9}h?Zh}f7#td_@dq*_}Jv7$-9yG z;BD-p(DE*im>F>0kO7?;GUPqW=CWDPMbvhDhe&>(fls%t_Brk(X7RLr&?7=85KV}P&DGe>y;2h(H<8AuOyq3|R*{;@3mBybFK)%y(+4X|Ih5r??t%D(gho#%MA)0c%2s zUZz#)FCx%`wTA;(BeO(Eo?#MIFom`6yFZk)?>6L{q`R%{s?R(M<|plM%iDLaOd8Gl zRPkZF^L8~3T{;r1M#}o&lYZxn`L2zBQ=E}KH*HoW2LRN*oU5$Idoz4KJHfyCa(^D; zhhXeNq{R63D4x><)J6^)%t^hsLYUa-AYeA7K1lxxAPx+Kyx#;u$s@{>nQOVAaqtad zG)uISv-1u>DI#7j9}qzflAr-D#0?tkExv_;f2*F~z^_|m!z3}5EaIYco@ZL+1sz6$ z1H6GFQ0czQDrd===r)XP7X&BysDU04{jD@JKhL=>&2xzVw=5aK{_c}5M6&v#WW$cFSg0&1sMTey>gvr!Fys1Tj6oAy~j!MT@J!#@i*IDg9gYoix? zR9h24JG%3&lC+G8#j6bm7kZ1$(NOx8hXU2E?iu0dV)necf>jgkEUY;>Kk|W6i1)aR z@9Mp(cfsp@dyIABp6^;HQMmQ+Rb4gmHpnhd2^AZilNZXcrE4Rz=a0BbFG3(TuR=oU z^qS1WL~pdGA(gc01f6wrZ&;5(aIbGev;0NsYZvvqN%g~^R+iLBDshq^iQYNez`B{> zB{^oN1=dfbd|6nj?JP=SL`GpGS8%YhvT8=qNTo2Js}Sx3ADvyR)ftwaWj*~vEnZrf z!JNLO1+NDA1P|*$h`4y>Nvd#^y|Ru+dPQ44=v#o&!a=~$G~oJjl=`QD%jdW;Cxi-) z(ERP>PsV!T{~jT=-{?;Pt`m^$3*J#-yF!Ju;X@)Ifz@Hqfg}G>QYraNWaYYb0 z#;VQxAkmvoWz$&?k5}%ylMo@LA`7QeT^5TU{iYx|JLOdidZ-6>(30XNQUUnXF;uhZoMQAT?d^wotX_odQC^PZ^9p8QGx6%2nmO|EhABf9+l>N%5XuP+Yh`3TBU{F(LR$|CmMN^ ztW&(G@WT{-Im$+S&HWECHmWsG2YeJ_KWOL>l;a89S2ow5K6YZ-FUWx05)I3_@iD)N ze|JQ+M($Rw^RHd1gPP=*z07wBx9u(AmkPaGn{+a-^?UR6FOq2a6tgT1A~7h;KYtea z^pfo9$cOY8yY%P0%6x}K*pG;qgkXyjG;{qRELh|sut3_3gvU^?=N0%d7S^8B6ksCa zn-X?h0DTpOj`WLdzo+Uv!^C_PQT>$$o({Xc#Nwz{Mh8LoZG2DIzt&JCwveUr=(V55 z2BepEG|6r6k<167W#~A(=FNq#WrOVJmdsD1pCXDHIihck@(V$CDb9NHZeZYBs|5_~ znL_EOwrqa5$?>o$)gG3Lm%ycBS<%ph8+21X!g;*>o+BQL?`X<%CTp9& zntzN%<@7=WuC@FD>ZvYz@3F3y?Y*(dh;DQ~`|pHsK%WK}F^)0tQ1xzQ-;kDDZ0Q?C zTSL{gtOqwV%ie>?Udf+NO0NiNLhQqY1D<*hNLL>*rx;9*n^}9cUmh{u2r10xM?(}f zr%)M``F9mqnQV-xB&xqK;1&^ac0BYDK%Sx+cCF0jrsu%VGX#aVuZGRq}QiMN*G@Q z0s%3$!L*ii1vwrz2P~OS$a%l|Q+2obYoCG%jLG_Nd31XBSOU)bm7jgS(Z&sM;_U4- zn#8K9E zCcxIx?#|<&pT2&?A$zQ!XVo%iT@tj`9_1q&k+aG~G6m7gySxR}B78kc*wl(p>!}F} zSsgGg3&Ix&uy`>LsJ>luS@dX1K~MJ9<;5boSVePea>=*n7}zNML4@>w4`@u>Oz$bTfsRhZ_DpXFYVJ%Bqx;O2%51aTnC@sji& z-yXHzNva%Noo|QL-lPk;%)Q<{$$WF|Oat|H)yp&l9tcl^$UP6XgS^mh6=;wsz%shWJK-d^zmS}G1xmNNX z|Hb}`hGK$8rJXD4&@errm1!)USlm6(Q`uC5k2+1_shPNR+A+z+VkOLM%B z_C==e&@VlF-AVWG?(9So!g7}Ig3mw?$L;h45;{QsoY`c;gSA9&j*x~V618b{mft9L zBmXffFR&YE@9U7C(WuD&O*ZEAiBOHFw}v`B4^_#hGw51opAW=3ktF3ec>M5f`!)%$ z_BRGeqS?eC#(dN&8jsIaK8mHPipUfM`!H+Q-rW_lWy6ir6R1|+|~D1PrBxh$x4 zZ>6q#hQFB)Xvv(n2yY9TOFElBe0zB*i&q;7b^Jt=PILh|8=aT$qceu(PW0wp+yC<8 zP-yjquZ8wFlAG^pkwWAg)zFnJ$ivGJo+BTgl zNzbG5HZpoFKrj7{RUez~=^C{r4h#KD)+)jTMjZmKD)4Po`0O^DNB$-?FaV1uX6%v6k8`np4`77 zo5IC>a=%RblH z^z=Tjd@fS%F(kAjMd7!PY@Is!zfli?%Mm|+loyT1}B5i zfyDOsQqyyOZOjh2FF}MZfj0*$Cojj`kl?m>Vq?`q!JT^-Xm)}9p_vHIj=2e*Sa@R2 zYY6W93z|%X5NloHjY>3PO_|aM4$qNiP~gPAth5Me)oK-{u_v0U z&n3?Bt|A&c4>jObsEDpPbT^dX)yzJ*#_`UfTgsV9xb1+Jf?o()_uT{feizOGa96#H zPnbP%Jp3z8g@}OM_WkT-+u;M8TjL`#6=Z=M4B&uu(|9Lzx|jdIR%mVJy_eCzmT7ZJ6e5t5!rgYG;m z&N9m3fwhiiBkP*gL(JY2D+;-(T=>1YNV~%gk8)xrSFi&0I9G z*h$Rilh^a6Tc;O3T7CmX*oAZ6CJRd~OP6S6XE)iZeA(cM8D6Uc+Z=E=J9Sn9kTla$UfRv)eWHdy+b@-VIBE-#`V~S`bBRt zx<-`mN$Mcx3pDZmcH4mC254^198ePjCL_s$_~{0zebdI;|zM^m2e*5ERA0 z)!FZ3z*|ICe)4%%n&ZPfu~23b$WE~IZvgI(z-$8vczMYH1F4*9P)FvVrG~UWEHkw> z4^`>;zqIf0Y4Nk#0U!x*%xWRw zn+EHg1nU*>_0zhL~dvt|I#~a6~P_!FNrD#s+!9&D58A6 zRNfBo@I(4js5>$>n;SbMs}LffOgyUpLv_L|I95q`_g#bMmhpcaX`KCii=6d@*k>6Ql@4_!6dlZk{kQ=Chj(Lx~=%2=EjJHnCbDnKiAqSsW?m13Xi?b;0#UnnmVPteT z(&4msl+*^((wtP394`a$)j@1P!IeBr9S@N! zgNPLhh{m8aoSNY&2SuK`DxD8RpGG5k=u~^m(N(-n^5ePdIsNa>m@fK;SP;rQ*jetI zH5&*YO)~}O4@U052qp-^?Dzs$WFx9fw_ytxX+lkk->c<+NHGdHn6+93^Z=`9ix@B57;2UXdQ zduO2c?VZ%|xe+R*w5LmxyG{FdD&=$T3``Q26R4-@vzE|bZ}zKe2}^%-8cpC;8rxJv zJOpWpuq3zXhAi!DX{?LR)~+66cxdK@k5QkxgP_M%k~g!N&IpB@3z9UvZJqJHyxx|8 z;<+w+vnK6*Md0nhsWnrm1>9ga_d=r8wg{O2Km8IBDznbC97wXbsGIgh*3Y{A9b6t0 zC*9RBLRR2c&!X*GKYrQu;am2@jl{4UaxloxdiOfE`n;A@PS1{ni(xqqpKs_A!I)6- zz;sqxxLjWcDL(Y2R4>_4KFxAoK7^grW+wT8#qA5@fKDu-R5_~4p;-_ZC9 z^mF_#I9`*nPBY}~_M`TRJy5LZHp4e-l6P+nh|PIG_*gt@k%`>S@KIDG4@8BM`@RFF zI5@D}*UVQ~@>{24kC^;MT{FR#k8sX1>wJJk`HqCw^rF_m#Vl+_z?cx&+vw^?9qE01 zvMXx=}5~+`9 z64WTED-GYBcv^lw#Dq5gExWBxFV_ae$$rmH6I{@m9okW&2g5ysN+!anGjNC1b80k= zxa}HuFK*LdtM9N5b`}KWbB2^t%v_6Ywg~L(9$AUUupCCtUnaF#^ZGr>s%)ss{dsAw z>)|R26gHEYAFd9>^yb?FzkQit3^M`D`9EEnCc2Sw;sgx3z>Q(Ad?!3!W4S2x&}>8@ zRQU|(;kATv+)A50`U1im_^}{C1h7z|c3yZNIIc%teU5d@qz0Nv5mX0FCtO_f(MD@k z_B%oCjlh`abk{`STZG;jfj=Qu1Qd|=DaM#U(5hd~XsKGZ)xG-n9O#3C|HiO|kig3< z_J>seJ41amm~r=~kr9xBd1mhwUUhlzqAwZ7AgRshjM6ZVS*JlDDK+6M!p1g{0o7*i z1NuQFu>~`C<1=os_d$1CxAe9ZtX^@w(mqUNmN=F4c_8Jg%(Z*V|HU9KvzHvM%26*I z(7wVV#yfD&WTLI7_KJg9`x4c0)`<(<`UK-Zp|i$_zJ79sO(9sw%$6*M&p@E+G=x?i zY56y1BO`vIFD&jIbpomIuh-Kb)?cEwh*)esL2@939W+w2W9fI0(v6Vn|^2!N>iGen2fgk6bhL`M7 zD;YQNBB;OmWA4`4o-`jMU=!&HYPKVRP;juqXXERK;(eieA?pEwARJeE6 zEJo+X>^X>b0O3!5IpOFVT_Kp|;6!#rhW$JmZRuna5?b@JdFqq%8nims}#B34>WU_ zpY_!w?p)Yg%8lzf0opAmWhL*^l=F`26p4#Ti((Kb_PM8r|m9$3TdhhdFm~ymdzQdz2 zHPkNRORM>xrp07*0cmG(H_8$>hAuTRyIUVUrEE zRf;5kI1jot_c6}NwmgtWZ!KcKzE-?f;?-DBD)pPq{1rn?mkEwtO-k6O2t4H9JeB%h z<$L&2UuORftonQLBPGcaDNwC%{e$qvr4Qp3*(eo3uh>_G2A%=_DNU!g?-nzG(1CM< z;dUZ3A<-$CO78=xV3O~4w1mk~`n1VT8FY_n{}qv7%0MHYGA-Jeda)a*>UXwA)d^G^ zzma>5+eScIgf%w$>NEy1?a}|gMkXML2(+hI59^;BN+AXPdnRfk7SDlS#m@GgQ>Z^1 zFQ;66uj`3-B?RZbcGgl6Ds|ufcRl#sTCpd7H5Ym;)acEW+dE_+Tiuua#`M$)0 zCT^ZhGdm-n5Z8MKSi9!dIOSm zW8dME`aI6_4jHdLv9@&|@pbc$2k$DM*ziD;aD8#B%`- z_&k3)DV1ytuBiJTXT%KKk)fhtI%mdNew$qr18^wuNmHDgP0#L)cLkekjP#q9BAT$4S)?wd7wB7S zR*DlN;dmBW%W@#ykA<3~dATWjwYW#%sXDY(5C>@|4s=3=fnD8y&oq_)OMwmZ^9QC6 zcJ3!$#X4I0J{q(fdZ5!&e*mDTq_s5MbR8uDPVJy%B^ifL#FM^ilp&4;Eu$(1T;vus zRW4P1DvF&MzdZh4n`OFPpFb1VX`|3(HLD*Nqf$N_{F!51_)!1VfL$%#!FAb|lY4|Q z16{S9b@=sbbc^)gVGAFGHoqIwU~#n_pT^NxwmmTPC21eiH_k_bV5mO^*Ip&6;Y4$# z;|;NQBH~s0wYnmmQItg!+nPj1*vAsvI>T;ZkaGCLPW_u}5F%aNSUz4wi7Z^!^xlCW zN`DH1+`;?jWQnqF^;f2k{Aa3S>JIGoe4X^*0udeXgKSRN%R_e7KuUg7{pnhL;l-^Cg0f>qGMiJDT)ER-C;qGE?gK3e+(rn_> znae?*EAUK`AFJtD(R?I{V?$*{L6`M*0drP`R3{i^Kj{5qw-FW3!9Jp@o1QrCk{kZHYI;=4%3`E#5H2kcJ^4@k(uNP~j9 zy5WCSLA6r3={nX)qV+Nhw>2`Cz!1h5SalXDmd}Gzal}1JzxQs1Sr z$D87t!SeGZ`M^i`qS(}Zu~v#PP5=#MVlTY)bSKSxL;JTZ4b^^sOx>yBT@F}}<9Iiq zy<)@wwoka#i-6HIbb7BpjFLf+=k_xv->Bhw24RW866CgDbkO-TkZhunbYyzZeQy;U z--y8o1|LU4u4qsQn=}jkwi8hoPz5xdz;KG5(FO{eAX0Xslv-%~1Lm{mp%8LJG9>v! zhQ;H+Iv*Q$Zj-ofP&RRxI>QSUc~0pNNxTq8SYeUMi>aLSigs|xFg)hUJ1H^AEjK&Q zgc4o>2X=bS`D(}S=jh12GYnMH8yl)ig_1mM2a+nL4j-F!!2Qrvy`>{C-@;*P^3#m2 z(&B=M>m0RTMJV`b4Se`N@m`7+In1-;rohC{w?ezAy?m7-Gvc3FT+=%0PzP zDRiXOEHx3q7VQ!HlESj&b~(JVc%*=(mDch56s$5^r<|^PT|6H+PyID|{-ZP{2A1m& zof;f#2zzR02BHQQIfE(lq4Qyvcy z=oT^mWpb~3Wa1)efG?~cfaT>&}HhVRL>LhDI{42)^tA_oV zKTJ7&zx9p?Cq9qPyU;+cDQ$!Qz`s-Aq-i&B&x;p@>NbDc*8$q@s8MJ2SRVkjbBS6Q zPQ_G-eNz#-!HQX6n@kRb)wlmj)IjQZL~nN^rYB=imht=}x1|r6Hf)jK>OX?)JzouO z^x$<%U|2C;C`RHO{ur=?ik&@$eHHf|A3KQBy66F;8LbB+F)!P`+x%|_6|tIBK#%c= zcjmrU47Uw^L1;OgV(A15*h7RuBVWtiL~Z>*ZSuj89x=3 z&+g8yYt;`&d%r?%ILGzf98nk9?861W00yz$P&1~p@{AE@>Uy#_lvpSl(oLzge@B8x zn4AXavF!aHs`Jc>^x(hQHGkkmMF=dqD;Q?D{A;LOTQZ%b&EjjP=@igkh7y=4rg2VMB z7G2n5vX=e?!nzNOfjadr#P6MVH6awX=_8XD4Fomp>=nG-LDHBdBIcbAz<#rlnCv&1_(^mfmMI;>0O*A@(;R1ED{HxH zE&fr~3a>prg9T76d`kJOQ?<1rwIDGSWz921yL5vDO7a7L8g+w2OPe-&j|Tu-mhB< zKb}Mpx}#w#-9weA((5XQ66EuyM?Z`d_|bzfN+-Tae|b58-8tIA@aJUwc>^viH3PfP z_(ca5ohkIDA#HNxHln4+e{fw+Ez+s)Mwj#*3jWrL+dr8|bsN4y{&*1i&lHso4Llrh zsazz5u1zTF75qTj`E>2sP3+L%Ly8ym642EGoezrFU}Gwk1*(3XY@Cft=C25{+k%}x zUB!qX-8Yr}jC1&>*~f_iIpq!8FRP~_vwy;Q-xvX7WZ*k0F6VnJMMeTB2Nv59pjQP} zE+U%C^YA$FpuGn(&nqO>JywjqL*~zC4teJ+nO1ty0Ps)3Kn4tDU~|!0NJk@BVT?mT z?t%{WkmQDWKeWGb?gEQdy_Unt#pUK^G2DIxCe)ZLn^$DZ(0H3;!e~tZ0x7RZ#zOPb z9>1P`#x}a7`jul%!q`OFlE$^?J3*BEPq5H;N>nvlnv+4mMH}UvH}8+UMRcSC@mAIy zDqTx)EWn`LjCmO9Bm{V)=h@Z9Zfx#R;n_bqL}ZPc6oXK=O%h3J`{3d zie!C1_>`trvzbrVq-bKh1#>3pT=+Hhcu;96w2L$XUnY!u0X9o<1|TObo^#l4p1uot zyyy5*Z6i5^r<1Px|B~)~)fEh6V8d&-h;{hWE1l<;A2UzCA}GykfmvT~MtC5b7@g#i z)9>bM*ZEj^k*{C!$cZU$xZ2K6&q%PL`OiLmBy#-~oI+s$;-jys=Rf+0A|-S^-@ zpW;1cU`c=jn-L-{E%1jRU3&Q|iK!7JT{4)Atc?z9qYVPx04zbblJ-bY<*N6MkwoIx zTR*RENK@ypPGZ7RWv@PUqrgxz|IsE%ii`eda-8}*8 zHS>_xLd$>XK^6hfj62^R`?me;y= z_ve$Wm;E1A#}WH&#O#JUsjST@T;_rCnPcFsjO0fVh@Zv-dWyhAK>S>_`T=Yg7fI8k zBawd2nPw(eiNL4MbKzyue9e~eSdTp~=4X4Q6rXs<<9l>ueq}!=e}6xpsR+WO)iFOm zUAO0F82eUB(;7kEGXO(TFPi<;R!70|P znYNMN2unuZJN>#5e;=yhN?Ao%Mg&rp=alA{_Z1`r?if-9LYm^DNxlc7#jJEop5XfN z)jKtrz1sx4=ey}q-{MAM4yU6hv46Hb!St+n&Url zhSK%jaNG`C)~*4T^u}NMDUCj%q&wk*$|?TdMUgPcaoW=<9RR+rU8_W|p<(bBOx=*K zN>%?|cf_yGO!B(-?VOf*b#eqZ>4KRj82BfXaK9JSiSASvL**u<7Hb3hBtiT*`u02& ztg7i9^T_Ex|3Ebu#+}m(TJxw6wo$w~%=igmfN}>%#?z7Mh9wi;)YHsmlH=vP;tJeN zeA?F~f-m+qfUpGf6=$AJL_%fiM_q94ZGbM)w&jKP08BjJU5%71ze>DAG^@T91TjBg zIEj!h{*r4NBW&l#_xd0J;h^|?%_#Z%JdGkwFTJT$jKj2c7IbUMXK21{qnjwKIGZ4Q zZKVM}X*?W<`qF-#K}v%$_o(lv$u10>Opodh*0ZSWZ{trT7LW73aYT0@4(o@mXMD7dz8mSNR z!@{LE0G zx$qv!rTbQV0_)gt;Cm9I-Q}IBeQW9z$Uy35S-((Y7)h91@di2)W#&$PP#b7;Su1e* zLxIG{L?<3=V9Ojv!KV;9bPpJQx@kg(ST28+3z$CyTwC_Yp=6dJzW0BtDBx9Uj{=x^48+THROsYJDz(0(#Es@J0+kL;j;e*YI za90F=&swEWYQ%LhUXVr917}a>i3XBxr3rf$)exlbnv5vj9FV1%Xicu(*4BO0{^(ZH zIO@20VoCXF-e^KgwzoO(S$}`5=x1UF_fN!TmF#3{G}QpbmiWwGje#!VaQJ9<64$bu zUE%mmi$Kw=gDy`(=`ESdDZn?=dopbVu_c2+D>XBf{|DOqnjCqdM`V3Gpm}xM)qvGY z>z{3EW~QDR$ZdvV^-)W(tuBAFH4#iVw?7E5?Q3lY&jg%kU5^)KN2G*^M)uIw0q z2>mJ1nY*0PA=-Z-IuYOEyCokc;Hdlv)p?(1N+D4249xE|g+NH&TyLnW;j6NiT%mIr z@k%}}n3yDdq^bU#_M-|m+V7C`%K@aIUsW6ciG`6f-F$1|1JR=`hArm`oy z`_UlNf%_}G0rNEiSZm@4O%Md5LUNd=(Db)|oX60uU7+f466~Z|aJmBzjnfv;s#g$X5|eZj^|7(Pwy)Q#fHDKT#o~MHWRK7$_3+^d*2pjMbw7uZ&Uip$rShSPwv0MDv7!09Vuf9_zEgZGNa~2Qvx)4z=~a z1XyTZA0@M&!HXF7eNWr^7%{I0mBCgvB?;_cYe(yujKEg;s_)l3F3__0d_f2HxqLfEH;pe)?g_3gU!kzP_^dpi zS8dejlNJ}KkL@2(jfSM3P_bLHCqSJqbr)fH^pLU0N0?(S^d z-Q7LFCU}tG?gV$Y;O-%~yF+l-;O>@iSI&KPs$ShMKA@{vYjsZA?h}y5h1Hg3I*i&ZZajdb2{qJ4|B+GR#NTy|0{}1fLzs3VvqW@u!9lL%! zUrYw441v^Zm;c=Ykoivt`bv#dV<&sR4ro%?kocUA7!P5|^maw78M!)&!E*9o<$q^s zA}@&)3oK=WR&jy{u#68ZK(DqgruIjjSeqK6Vng(Qb}zvK#ik{4!pN$xCGh6;Phgd5YgJPw2veIjuTc6QR9Ym zLs&gxU)Sq4;nMV%arjkz$r0Pb{iPejPdaTm>i(~i$HE^LZdi9w^<9%1Y0{_yeSu8e zI}3|G5*^ckQ$v(_v{R#}GH5^}8q3t>kQjLoVv(Au3Q0?wm>jCaPybsYR$A~ic1S%? zJV{SvLrvQVtu(|fI#tJ@K?8gVJ&uY%sJ-*#sf5<9B_K|bHehI$7!&t}yl+;O`rD5=6p0x-*z*OZhN=szx z{Z5CdNrt8h*6XI>g8lL zS`Qowc}ROJ@_7<~{_5X<&9*S$-u((pxrYsg)TF~wmsB(P3PJ7-%xa9h4^+}UTnjnR z2hy-x;Fgk3u7-qK5O~WFk-u?sWqr}TFAZ~}$ zUD*t@gNoG`s4z^4uArex;;NU7tSA)SNB zRSL`bSz-~IhHHlPteI)#4;IUZ;!>Qm_T#)|DX$DwP3AAdQf#ohT9+dL$YQum*l1sG zL6TeHMMd4z51)h@yC-@rSSv}v58ID91d|oq?&!PG4C}`Yix1R#l9#mx$;44e07Z|{ zu@Iri;{Wts6Q5pvrT`sOvji`Un*!CXE3CmVYDS9f*LayD(SyNQZjHLUzCIA8FhUZJ zH9$X;x_=N<#eh-m+0o$NtsrFmInke_)g2O}Y~<#G&~GHqWeo-05-70 zI$vKnmB-TQUO2lp!6%WNh*PxXcVggv2gKqVyC_E(Z7|nQ3i-lgz9;FY#1%-Kr1!hj6_h}KM=mT zM6qerZWzRhlD!}tU-~ObOSxgtX`}jKS$K6-7O{ny^XMYI?B|_-Sr0iD@9H#(40_eM^ag`hufKg0*#p6{r z-&>7MxttmV#PmezR~@zh5s%zk{hjG3=HLQ w;_@$G*EK@_Qvr?z+u_ofx(lzD2 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 Gg8m0m3QXw$ From 1261435835c039a7c7e43a66e84924091a52e559 Mon Sep 17 00:00:00 2001 From: Christian Zimmermann Date: Sun, 4 Feb 2024 00:26:28 +0100 Subject: [PATCH 8/9] correct CMakeLists.txt --- CMakeLists.txt | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index fb5a89f..9499092 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,11 +1,13 @@ -cmake_minimum_required(VERSION 3.0) +cmake_minimum_required(VERSION 3.5) project(cnorxz) # LIB VERSION -set(VERSION_PART "pre") -set(VERSION_TAG_HASH "6857e3fc7d0af25db3a925791d1cabc6342b930a") +set(V_MAJOR 0) +set(V_MINOR 0) +set(V_PATCH 0) +set(VERSION "${V_MAJOR}.${V_MINOR}.${V_PATCH}") # OPTIONS @@ -20,21 +22,13 @@ include(cmake/check_avx.cmake) execute_process(COMMAND bash "-c" "git rev-parse HEAD" OUTPUT_VARIABLE GIT_HASH OUTPUT_STRIP_TRAILING_WHITESPACE) execute_process(COMMAND bash "-c" "git rev-parse --abbrev-ref HEAD" OUTPUT_VARIABLE GIT_BRANCH OUTPUT_STRIP_TRAILING_WHITESPACE) -# BUILD / CHECK VERSION STRING +# BUILD VERSION STRING -message(STATUS "${GIT_HASH}") -message(STATUS "${VERSION_PART}") -message(STATUS "${VERSION_TAG_HASH}") -set(VERSION "${VERSION_PART}") +message(STATUS "git hash = ${GIT_HASH}") +message(STATUS "git branch = ${GIT_BRANCH}") if(NOT ("${GIT_BRANCH}" EQUAL "release")) - if(NOT ("${GIT_HASH}" EQUAL "${VERSION_TAG_HASH}")) - string(SUBSTRING ${GIT_HASH} 0 7 GIT_HASH_SHORT) - set(VERSION "${VERSION}-${GIT_BRANCH}-${GIT_HASH_SHORT}") - endif() -else() - if(NOT ("${GIT_HASH}" EQUAL "${VERSION_TAG_HASH}")) - message(FATAL_ERROR "version mash-up, do not use, contact maintainer") - endif() + string(SUBSTRING ${GIT_HASH} 0 7 GIT_HASH_SHORT) + set(VERSION "${VERSION}-${GIT_BRANCH}-${GIT_HASH_SHORT}") endif() message(STATUS "version = ${VERSION}") From 9b9a8a596e0f225d82c0de1ea3eba75fb88602f3 Mon Sep 17 00:00:00 2001 From: Christian Zimmermann Date: Sun, 4 Feb 2024 00:39:28 +0100 Subject: [PATCH 9/9] update TODO --- TODO | 31 +++++++++++++------------------ 1 file changed, 13 insertions(+), 18 deletions(-) diff --git a/TODO b/TODO index f76be28..e5eaef7 100644 --- a/TODO +++ b/TODO @@ -1,19 +1,14 @@ -include/operation/op_types.cc.h@173: "build and execute assign expression forwarding outer index" [long] -include/operation/op_types.cc.h@446: "TODO: implement ifor with func arg" [long] -include/array/array_base.cc.h@35: "TODO: check if container format is trivial" [check] -include/array/array_base.cc.h@120: "TODO: check if container format is trivial" [check] -include/array/array_base.cc.h@164: "check further compatibility of index/range format" [check] -include/array/array_base.cc.h@319: "check further compatibility of index/range format" [check] -include/base/dtype.cc.h@23: "for tuple use vector" [comment] -include/ranges/index_base.cc.h@110: "if this assert never applies, remove mPtrId (-> Defaults)" [long] -include/ranges/mrange.cc.h@633: "TODO: ZRange (meta and index pos static!)" [long] -include/ranges/urange.cc.h@366: "else general transform using DType (better than nothing), to be implemented" [urgent] -include/ranges/urange.cc.h@430: "else general transform using DType (better than nothing), to be implemented" [urgent] -include/xpr/for.cc.h@314: "check for write access" [check] -include/ranges/srange.cc.h@292: "TODO: check for selected static sizes of SRange -> return SRange" [long] -lib/ranges/crange.cc@114: "preliminary solution (TODO: implement xpr that simply returns PosT value)" [long] - -opt/hdf5/lib/h5_group.cc@166: "IMPLEMENT" [urgent] -opt/hdf5/include/h5_group.cc.h@34: "not implemented" [urgent] -opt/hdf5/lib/h5_table.cc@127: "not implemented" [urgent] +include/operation/op_types.cc.h@225: "build and execute assign expression forwarding outer index" +include/operation/op_types.cc.h@498: "implement ifor with func arg" +opt/hdf5/include/h5_content_base.h@23: "IO save error handling" +opt/hdf5/lib/h5_dataset.cc@124: "all sub-ranges explicity" +lib/ranges/crange.cc@94: "preliminary solution (TODO: implement xpr that simply returns PosT value)" +include/ranges/srange.cc.h@307: "check for selected static sizes of SRange -> return SRange" +include/xpr/for.cc.h@324: "check for write access" +include/base/dtype.cc.h@23: "for tuple use vector" +include/ranges/urange.cc.h@384: "else general transform using DType (better than nothing), to be implemented" +include/ranges/urange.cc.h@448: "else general transform using DType (better than nothing), to be implemented" +include/array/array_base.cc.h@184: "check further compatibility of index/range format" +include/array/array_base.cc.h@376: "check further compatibility of index/range format" +include/ranges/index_base.cc.h@109: "if this assert never applies, remove mPtrId (-> Defaults)"