# Container with Native Operation Routines by XZ (CNORXZ) ![Image](./cnorxz_logo.png) ## 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. ## Build instructions The library can be installed by the following procedure (`gtest` required): ```bash git clone git@git.f3l.de:chizeta/cnorxz.git mkdir cd cmake -DCMAKE_INSTALL_PREFIX:PATH= make install ``` To build the doxygen: ```bash cd /doc/doxy doxygen Doxyfile ``` ## Linking To use the features of the libraries one has to include `cnorxz.h` and link against the `libcnorxz.so`. The tools of the library are accessible within the namespace `CNORXZ`. ## Documentation (Also consider doxygen) ### Basics and Library organization This library consists of several building blocks. For simple usage, the most important building blocks are [ranges](#sec-ranges), [indices](#sec-indices) and [arrays](#sec-array-types). #### Ranges {#sec-ranges} Basically, a *range* defines a meta data space. There are several range class types, which are derived from the abstract base class `RangeBase`. Ranges can only be created by the corresponding factory and exclusively exist within a shared pointer; they cannot be copied. Available range class types are: * `CRange` : Classic one-dimensional range. The meta data space is simply given by integer numbers running from `0` to `size-1`. The range size is determined at runtime. * `URange` : Generic One-dimensional range. The meta data space is user defined, the meta data type is passed as template argument. The range size is determined at runtime. * `SRange` : The same as `URange`, but the range length is fixed at compile time by the template integer variable `S`. * `PRange` : Partial or sub-range, i.e. a user-defined subspace of another range. The type of the range must be known at compile time, the subspace can be specified at runtime. * `MRange` : Multi-dimensional range, spanned by a set of ranges. The number of ranges, as well as their types must be known at compile time. * `YRange` : The same as `MRange` but the number of ranges and their types can be specified at runtime. #### Indices {#sec-indices} For each range type there is a corresponding index type (`CIndex`, `UIndex`, `SIndex`, `PIndex`, `MIndex`, `YIndex`). They act as const iterators on the ranges and are a crucial component to define operations on containers. In contrast to the ranges, all index types must be known at compile time (static polymorphism, `IndexInterface`). Apart from range specific indices, there exist also special indices: * `DIndex` : Dynamic index wrapper, for the case that the index type cannot be determined at compile time. * `AIndex` : Array index. Const iterators pointing to the data of an array-type object with data type `T`. * `BIndex` : The same as `AIndex`, but not const. #### Array types {#sec-array-types} Finally, there are the container classes (arrays), which are derived from `CArrayBase` (const) or `ArrayBase` for a given data type `T`. All arrays are defined on a range, their data can be accessed or iterated over using suitable indices. The array-type actually containing data is called `MArray`. Moreover, there exist array-types that do not contain data, but view the data of other arrays or at least parts of the data. These are called `CSlice` (const view) or `Slice`. #### Expressions and Operations ...