| IOLink Python 1.11.0

Loading...
Searching...
No Matches
API ChangeLog

# IOLink 1.11.0 - 2024-09-24

## IOL-880: Renaming of ImageType, ImageTypeId and ImageDimension to AxesInterpretation, AxesInterpretationId and ImageAxis

In C++ and Python only:

- ImageType is renamed to AxesInterpretation
- ImageTypeId is renamed to AxesInterpretationId
- ImageDimension is renamed to ImageAxis

In C#, these names remain the same due to technical reasons.

## IOL-895: Added a new method to access the underlying unmanaged memory buffer in dotnet

New `RawBuffer` method in `ImageView` in dotnet only.

## IOL-899: Added new read/write methods in C# to improve usability of ImageView

In C#, new extensions for ImageViews:

- `byte[] Read(VectorXu64)` which directly returns a byte array
- `void Read<T>(VectorXu64, T[])` which takes a typed buffer as argument
- `T[] Read<T>(VectorXu64)` which returns a typed buffer
- `void Write<T>(VectorXu64, T[])` which takes a typed buffer as argument
- `void Write<T>(VectorXu64, T )` which takes a typed value as argument (for scalar types)

## IOL-909: pandas interoperability module in Python

New class `PandasInterop` in Python `iolink` module, after importing `iolink.pandas_interop`. It provides two methods: `to_pandas` and `from_pandas`.

# IOLink 1.10.0 - 2024-06-19

## IOL-871: New functions for easier C++/Python ImageView interoperability

Added methods `create_from_pointer` and `to_pointer` to `ImageView` in Python.

## IOL-866: New extension to handle column units in DataFrameView

- new extension `ColumnUnitExtension` for DataFrameView
- shortcuts in `DataFrameView`: `unit` and `setUnit`.
- new upcasting mechanics for extensions.

## IOL-873: Added direct access to data for Vector and VectorX

data() and sizeInBytes() methods added to Vector and VectorX, respectively to get data pointer and to know its size in bytes.

## IOL-470: New operations for matrices

New matrix operations:

- Matrices multiplication
- Multiply a vector by a matrix
- Matrix inversion

## IOL-869: New factory for transformation matrices

Added new factories `TransformMatrix3Factory` and `TransformMatrix4Factory`, to be used for 2D and 3D transforms respectively.

# IOLink 1.8.0 - 2023-12-19

## IOL-377: New API to convert VariantDataValue

In C++:

- Added methods `VariantDataValueConverter::to<<type>>Array(std::shared_ptr<VariantDataValue> value, <<type>> * values, size_t arraySize)` to retrieve all values from a VariantDataValue into a pre-allocated array.
- Added methods `VariantDataValueConverter::to<<type>>(std::shared_ptr<VariantDataValue> variant, size_t index)` methods. This parameter allows to select the value to convert.

In C#:

- New methods `VariantDataValueConverter.To<<type>>Array(std::shared_ptr<VariantDataValue> value, <<type>> [] values)` to retrieve all values from a VariantDataValue into a pre-allocated array.
- New methods `VariantDataValueConverter.To<<type>>(std::shared_ptr<VariantDataValue> value, uint index)` to convert the Nth value of a VariantDataValue.

In Python:

- Slice operator is defined for `VariantDataValue` object so as to retrieve one specific value, or a range of value from the VariantDataValue.

## IOL-782: New class for UID generation

Add new class `UidGenerator` that defines the constant `UNDEFINED_UID` and the method `generate`, that helps generate a new UID.

## IOL-792: Rework the Indexer to use byte strides

New Indexer methods:

- `dtype()`: to get the underlying data type
- `byteStride()`: to get the byte strides of the indexer
- `byteStride(index)`: to get a specific byte stride of the indexer
- `byteCount()`: returning the total number of bytes indexed
- `isContinuous()`: checking if the indexed elements are continuous in memory

New Indexer constructors taking data types to build the indexer:

- `Indexer(shape, dtype)`
- `Indexer(shape, dtype, standardLayout)`
- `Indexer(shape, dtype, byteStride)`
- `Indexer(shape, dtype, byteStride, layout)`

All other old constructors are now deprecated.

# IOLink 1.7.2 - 2023-12-11

## IOL-531: ImageViewFactory::fromRandomAccess now raises exception

ImageViewFactory::fromRandomAccess now raises an exception instead of returning a nullptr when randomAccess size is invalid.

# IOLink 1.7.0 - 2023-09-14

## IOL-764: Support for buffer protocol in read and write region methods in Python

`ImageView.read_region` and `ImageView.write_region` methods accept protocol buffer in argument

## IOL-700: Optimization of reading operations concerning stack of images

`ImageViewFactory::stack` method has an additional parameter to set the thread count.

## IOL-763: Uniformize name of ImageView properties in Python

In Python only: ImageView.imageInterpretation property is renamed into ImageView.image_interpretation to uniformize with axes_interpretation property.

## IOL-709: Make variants of read methods that return an array in Python and C#

New methods for various view types that read data, in order to make a version that return an array:

- In C#:
  - In `StreamAccessExtension` adding `byte[] Read(this StreamAccess obj, uint size)`
  - In `RandomAccessExtension` adding `byte[] Read(this RandomAccess obj, uint offset, uint size)`
  - In `ImageViewExtension` adding `T[] ReadRegion<T>(this ImageView image, RegionXu64 region)`
  - In `DataFrameViewExtension` adding `T[] Read<T>(this DataFrameView frame, uint column, uint offset, uint count)` and `T[] Read<T>(this DataFrameView frame, string column, uint offset, uint count)`
- In Python:
  - In `StreamAccess` and `RandomAccess` you can specify a number of bytes to read instead of a destination buffer, and the function will return a `bytes` instances containing the bytes read.
  - When using the `DataFrameView.read` method you can now ommit the `dst` paramaters, and if so, the read data will be returned by the method itself.

## IOL-747: In Python, uniform method can now accept different input types

`ImageViewFactory.uniform` can now be called using a single value, a list or an array.

## IOL-708: Improve read/write methods in ImageView and DataFrameView in C# and Python

In Python:

- Read/write methods in ImageView can now be called with arrays, lists.
- Write methods in ImageView can now be called tuples.
- Read/write methods in DataFrameView can now be called with arrays and lists. In C#:
- Read/write methods in ImageView can now be called with typed arrays.
- Read/write methods in DataFrameView can now be called with typed arrays.

## IOL-711: Support for any sequence were you have a vector argument in Python

All method that take a `VectorN` or `VectorX` as argument can now be given a sequence, like a tuple or a list instead.

# IOLink 1.6.0 - 2023-06-26

## IOL-728: Add extension to View so as to retrieve data origins

New Method View::viewOrigin() to access to ViewOriginExtension. ViewOriginExtension is a new extension which allows getting information about view data.

## IOL-629: Add string representation for DataFrameView, and also html in Python only.

Added method `DataFrameView::toString` in C++ `_repr_` and `_repr_html_` methods are available in Python.

# IOLink 1.5.0 - 2023-05-05

## IOL-698: New helper to know if 2 views have common ancestors

New method DependencyGraph::hasCommonAncestor

## IOL-678: Add shortcut to set elements of data frames

Adding a new method to simply set the value of a `DataFrameView` cell:

- `setAt` in C++
- `SetAt` in C#
- `set_at` in Python

## IOL-687: Add an allocate method to create empty in-memory DataFrameViews

New DataFrameViewFactory::allocate() method without parameter to create an empty (no row, no column) in-memory DataFrameView.

## IOL-681: Add shortcuts in ImageView to ease ImageProperties access

Following methods are added to ImageView to get properties values:

- axesInterpretation()
- bitDepth()
- hasAlpha()
- imageInterpretation()
- spatialDirections()
- spatialOrigin()
- spatialSpacing()
- spatialUnit()
- valueRange()

And also methods to set the values:

- setAxesInterpretation()
- setBitDepth()
- setAlpha()
- setImageInterpretation()
- setSpatialDirections()
- setSpatialOrigin()
- setSpatialSpacing()
- setSpatialUnit()
- setValueRange()

## IOL-601: New extension to ImageView to retrieve information about parallel access capabilities

New extension class: `ParallelAccessExtension`. Provides a method to retrieve a ParallelAccessCapability flagSet which indicates available capabilities for parallel accesses.

# IOLink 1.4.0 - 2023-02-03

## IOL-616: Add serialization support for ArrayX

New methods in `Serialization`:

- `encodeArrayX` with variants for all ArrayX types
- `decodeArrayX` with variants for all ArrayX types

## IOL-617: DataFrameView serialization

Added 2 new methods:

- `Serialization::encodeDataFrameView` to encode a DataFrameView into a stream
- `Serialization::decodeDataFrameView` to decode a DataFrameView from a stream

## IOL-618: Add methods for Matrix serialization

New methods added:

- `Serialization::decodeMatrix3f` and `Serialization::encodeMatrix3f`
- `Serialization::decodeMatrix4f` and `Serialization::encodeMatrix4f`
- `Serialization::decodeMatrix3d` and `Serialization::encodeMatrix3d`
- `Serialization::decodeMatrix4d` and `Serialization::encodeMatrix4d`

## IOL-557: ArrayX::toString method now displays array content (Numpy-style)

New `ArrayX::toString` method behavior that displays the content of the array (Numpy-style)

## IOL-630: Add data frame cell value access

Added methods for each language interface, as it is not C++ wrapped. In C++:

- Adds two variants of the `at<T>`template method, one taking an index as the column argument, and one taking the column name In C#:
- Added two similar variant of the `At<T>` method In Python:
- Added the `at` method

# IOLink 1.3.0 - 2022-10-07

## IOL-578: Add memory implementation for DataFrameView

- New `DataFrameViewFactory` class to create DataFrameView instances
- Methods to read/write string from DataFrameView instances in Python and C#

## IOL-581: Add equality operators for ArrayX

- Add `operator==` and `operator!=` method for ArrayX.

## IOL-440: Possibility to convert ImageView to Numpy with dimensions reorder

- New NumpyInterop.order_to_numpy_array method which allows to reorder dimensions at conversion into numpy array

## IOL-585: Inter-operability between StreamAccess and RAW IOBase python interface

- In python, new method `to_raw_io` in StreamAccess to retrieve the RAW IOBase adapter for the current stream.
- It is also possible to use `RawIOInterop` static class to do the same operation on a StreamAccess.

## IOL-590: RegionX can now be stored in containers

Implementation of missing constructors in RegionX:

- Copy constructor
- Move constructor
- Assignment operator (by copy and move)

## IOL-594: Possibility for user to convert a Numpy into ImageView and set major properties

Both `NumpyInterop.order_from_numpy_array` and `NumpyInterop.from_numpy_array` methods have now 2 optional arguments:

- interpretation (to set an ImageInterpretation)
- hasAlpha (boolean)

# IOLink 1.2.0 - 2022-07-11

## IOL-522: Add equality operators in ImageInfoProperty and SpatialCalibrationProperty

Equality operators (!= and ==) are now available for `ImageInfoProperty` and `SpatialCalibrationProperty`.

## IOL-513: ImageType can now be initialized from an integer

- New constructor `ImageType(uint64_t val)`
- New method `ImageType::value()` which returns the internal integer value

## IOL-553: Added possibility to serialize ImageViews

Two methods added:

- `Serialization::encodeImageView` to serialize an ImageView into a Stream
- `Serialization::decodeImageView` to unserialize an ImageView from a Stream

## IOL-535: add a new extension for tiling information in ImageView instances

- New class `TilingInfoExtension`
- New provider `ExtensionProvider`
- New method `ImageView::tilingInfo`

# IOLink 1.1.1 - 2021-05-30

## IOL-570: toString() and <strong>repr</strong> available for new objects

New `toString()` methods for:

- `ArrayX`
- `View`
- `Matrix`
- `Writer`
- `RandomAccess`
- `StreamAccess`

# IOLink 1.1.0 - 2021-03-29

## IOL-482: C# - new friendly variant of ReadRegion in IOLink

New `ReadRegion` which directly returns a byte[] in `ImageView`

## IOL-427: Add possibility in Python to initialize a Vector/VectorX with an iterable

Possibility to write:

`v = iolink.Vector2u64([2, 3]) vx = iolink.VectorXu64([2, 3, 4])` or `v = iolink.Vector2u64((2, 3)) vx = iolink.VectorXu64((2, 3, 4))`

## IOL-450: Make capabilities more user friendly in Python

Capabilities enums are now implicitly convertible into their counterpart capability sets. Enabling user to use `capabilities.has(ImageCapability_READ)` syntax Instead of the more verbose `capabilities.has(ImageCapabilitySet(ImageCapability_READ))`

## IOL-500: Add simple method in Python to read a region from an ImageView

In python, it is now possible to write: `buffer = imageView.read_region(region)`

## IOL-466: enhance MetadataNodeHelper

Add new `MetadataNodeHelper::exists` method that tests if the given path exists in the children tree.

## IOL-505: Add 'support' method for all objects with capabilities

New methods added:

- `RandomAccess::support`
- `StreamAccess::support`
- `MultiImageView::support`

# IOL-272: Add ToString methods to most common objects

ToString() methods have been added to following objects:

- ImageView
- MultiImageView
- Region and RegionX
- LodImageView
- ImageProperties
- SpatialCalibrationProperty
- ImageInfoProperty

## IOL-525: Fix ambiguity of MultiImageViewFactory::unstack in Python

`MultiImageViewFactory.unstack`splitted into two different versions:

- `MultiImageViewFactory.unstack_dimension`
- `MultiImageViewFactory.unstack_dimension_index`

# IOLink 1.0.0 - 2021-01-20

## IOL-514: Fix C# wrapping issues

In order to wrap the API in C#, we had to modify the `HTTPHeaders` API, by changing the definition of `Entry`. `Entry` is now a `struct` with two fields: `name` and `value`.

## IOL-460: Remove lockers for threadsafety access to improve performance

Add `makeThreadSafe` method in ImageViewFactory to make any ImageView threadsafe

## IOL-441: Homogenize integers in API

All over the API, unsigned integers types have migrated from `uint8_t` or`uint64_t` to `size_t`.

In `Indexer`, all the order arguments or accessors changed to manipulate `VectorXu64` instead of `VectorXu8`.

## IOL-436: Impact of API review on properties

`PropertyMap` class is renamed into `ImageProperties`. `ComponentInfoProperty`, `SampleInfoProperty` and `DimensionInfoProperty` classes are removed

Creation of `ImageInfoProperty` class which gathers all properties from removed classes:

- `DimensionInfoProperty::type()` moved into `ImageInfoProperty::axesInterpretation()`
- Creation of `ImageInfoProperty::setAxesInterpretation()`
- `SampleInfoProperty::interpretation()` moved into `ImageInfoProperty::interpretation()`
- `SampleInfoProperty::hasAlpha()` moved into `ImageInfoProperty::hasAlpha()`
- `SampleInfoProperty::setAlpha()` moved into `ImageInfoProperty::setAlpha()`
- `ComponentInfoProperty::bitDepth()` moved into `ImageInfoProperty::bitDepth()`
- `ComponentInfoProperty::setBitDepth()` moved into `ImageInfoProperty::setBitDepth()`
- `ComponentInfoProperty::valueRange()` moved into `ImageInfoProperty::valueRange()`
- `ComponentInfoProperty::setValueRange()` moved into `ImageInfoProperty::setValueRange()`

Following methods are removed:

- `ImageProperties::componentInfo()`
- `ImageProperties::sampleInfo()`
- `ImageProperties::dimensionInfo()`

Creation of `ImageProperties::imageInfo()` method to access to ImageInfoProperty object.

`direction()` and `setDirection()` methods in `SpatialCalibrationProperty` are respectively renamed into `directions()` and `setDirections()`.

In `SpatialDirections`, following methods are renamed:

- `columnDir` into `columnDirection`
- `rowDir` into `rowDirection`
- `sliceDir` into `sliceDirection`

## IOL-453: Move Endianess converter in DataConverter class

EndiannessConverter class is removed. Its internal `convert` method is renamed `endianReverse` and moved into `DataConverter` class

## IOL-448: Arrays API review

- Removing template class `Array1` and all its aliases.
- Renaming `ArrayX::dimension` to `dimensionCount`

## IOL-445: API review on Region class

Following methods in Region and RegionX classes are renamed from:

- `dimension` into `dimensionCount`
- `numCells` into `elementCount`
- `slice` into `extractSliceFromAxis`

## IOL-456: Implementation of RegionXDivider is made private and renaming

`RegionXDivider::maxElementByChunk` method is renamed into `elementCountByChunk`.

## IOL-446: Rework of Indexer API

- Rename `Indexer::order` into `layout`
- Rename `Indexer::sampleCount` into `elementCount`
- Remove static methods `Indexer::computeStride`, `Indexer::computeOrder`, and `Indexer::computeElementCount` from public API

## IOL-455: Miscellaneous API changes

`ComposedView` interface is removed.

## IOL-447: API review impact on DataType and DataTypeId

`DataType::dimension()` method is renamed into `elementCount()`

`DataTypeId` is now a real enumerator which contains the numerical identifier of each `DataType`.

## IOL-452: Changes after DataAccess API review

Remove `BUFFER_INFO` capability from `StreamAccess`. Removing the methods `StreamAccess::size` and `StreamAccess::capacity`.

Adding `MEMORY_ACCESS` capability to `StreamAccess` and `RandomAccess`, adding three new methods:

- `buffer()`, that return the internal memory buffer.
- `bufferReadOnly()`, that return the internal memory buffer in read only.
- `bufferSize()`, that return the internal memory buffer size in bytes.

`ALL` capability removed from `StreamAccess` and `RandomAccess`.

Rework of the class HTTPHeaders that previously was a std::map alias. It is now a fully defined class on its own.

Some factories methods were renamed:

- `StreamAccess::loadInMemory` to `StreamAccess::copyInMemory`
- `RandomAccess::loadInMemory` to `RandomAccess::copyInMemory`

The arguments of `RandomAccess::fromBuffer` were inverted, now being (buffer, size) from (size, buffer).

## IOL-454: API Review impact on Matrix

In Matrix class, added new constructor with C-array parameter. Added operator() to access to an element.

## IOL-444: Changes after vector API review

`VectorX::squaredLength` and `Vector::squaredLength` now return a double.

The `Vector` constructor using padding is now reduced to only manage the conversion of a vector into a vector with a different type.

## IOL-463: Add method to check the presence of a child in a MetadataNode

New method `MetadataNode::hasChild`

# IOLink 0.30.0 - 2021-12-16

## IOL-408: MetadataNode refactored as a class

`MetadataNode` is not an interface anymore. `child(const std::string & key)` method now raises an exception if the key is not found

Creation of 2 objects to iterate on MetadataNode's children:

- `MetadataNodeIterator`
- `ConstMetadataNodeIterator`

Following methods of MetadataNodes now return a MetadataNodeIterator object.

- `begin()`
- `end()`

Following methods of MetadataNodes now return a ConstMetadataNodeIterator object.

- `cbegin()`
- `cend()`

## IOL-434: Add extension system on views

New `Extension` interface, that will be inherited by all future view extensions.

New virtual method `View::extension` that should be used to get a specific extension on a view.

## IOL-437: Refactor ImageViewFactory after API Review

In ImageViewFactory class:

- `loadInMemory` method is renamed into `copyIntoMemory`
- `allocateOnDisk` method is renamed into `createOnDisk`
- `loadOnDisk` method is renamed into `copyOnDisk`
- `reinterpretOrder` is renamed into `reinterpretAxes`
- `extractRegionPacked` is renamed into `extractAdjustedRegion`
- `createOnDisk` and `copyOnDisk` methods do not take a file path in argument, but a directory path. An exception is now raised if the directory does not exist.
- `copyInMemory` now raises an exception if properties are not valid.
- `flip` method raises an exception if READ capability is not available for input image or if properties of input image are not valid.

## IOL-438: Remove optional parameters from public API

Functions that had default parameters, are now splitted in two versions, to avoid default parameters:

- `ImageViewFactory::allocate`
- `ImageViewFactory::createOnDisk`
- `ImageViewFactory::fromBuffer`
- `ImageViewFactory::fromRandomAccess`
- `ImageViewFactory::uniform`
- `ImageViewFactory::interlace`
- `DataType::DataType`

Default argument of `MetadataNodeHelper::createPath` removed.

## IOL-435: ImageView API changes after API review

`ImageView::dimension` renamed to `ImageView::dimensionCount` and made non-virtual. It is now only a shortcut, and is not polymorphic any more.

Changes in `ImageCapability`: `ALL` removed and `BUFFER` renamed to `MEMORY_ACCESS`.

New `ImageView::support` shortcut method to check an `ImageView` capabilities easily.

New `ImageView::bufferReadOnly` constant variant of `ImageView::buffer` method, so it can be used on constant `ImageView` instances too. It returns a read only buffer to not alter the instance.

# IOLink 0.30.0 - 2021-12-16

## IOL-408: MetadataNode refactored as a class

`MetadataNode` is not an interface anymore. `child(const std::string & key)` method now raises an exception if the key is not found

Creation of 2 objects to iterate on MetadataNode's children:

- `MetadataNodeIterator`
- `ConstMetadataNodeIterator`

Following methods of MetadataNodes now return a MetadataNodeIterator object.

- `begin()`
- `end()`

Following methods of MetadataNodes now return a ConstMetadataNodeIterator object.

- `cbegin()`
- `cend()`

## IOL-434: Add extension system on views

New `Extension` interface, that will be inherited by all future view extensions.

New virtual method `View::extension` that should be used to get a specific extension on a view.

## IOL-437: Refactor ImageViewFactory after API Review

In ImageViewFactory class:

- `loadInMemory` method is renamed into `copyIntoMemory` `allocateOnDisk` method is renamed into `createOnDisk` `loadOnDisk` method is renamed into `copyOnDisk` `reinterpretOrder` is renamed into `reinterpretAxes` `extractRegionPacked` is renamed into `extractAdjustedRegion`

`createOnDisk` and `copyOnDisk` methods do not take a file path in argument, but a directory path. An exception is now raised if the directory does not exist. `copyInMemory` now raises an exception if properties are not valid

`flip` method raises an exception if `READ` capability is not available for input image or if properties of input image are not valid.

## IOL-438: remove optional parameters from public API

Functions that had default parameters, are now splitted in two versions, to avoid default parameters:

- `ImageViewFactory::allocate`
- `ImageViewFactory::createOnDisk`
- `ImageViewFactory::fromBuffer`
- `ImageViewFactory::fromRandomAccess`
- `ImageViewFactory::uniform`
- `ImageViewFactory::interlace`
- `DataType::DataType`

Default argument of `MetadataNodeHelper::createPath` removed.

## IOL-435: change ImageView API after review

`ImageView::dimension` renamed to `ImageView::dimensionCount` and made non-virtual. It is now only a shortcut, and is not polymorphic any more.

Changes in `ImageCapability`: `ALL` removed and `BUFFER` renamed to `MEMORY_ACCESS`.

New `ImageView::support` shortcut method to check an `ImageView` capabilities easily.

New `ImageView::buffer` constant variant, so it can be used on constant `ImageView` instances too. It returns a read only buffer to not alter the instance.

# IOLink 0.29.0 - 2021-11-17

## IOL-390: Calibration property rework to work in 3D space

Rework of the calibration property, migrated from `CalibrationProperty` to `SpatialCalibrationProperty` in order to show that it handles 3D calibration now. With this migration comes other changes:

- Its methods `origin()` and `spacing()` now return `const Vector3d&`
- Method `units(index)` is now more simple: `const std::string& unit()`
- New method `direction()`

New class for handling directions: `SpatialDirections`.

Method `PropertyMap::fromShape` renamed `fromDataType`, as it only takes a `DataType` now.

## IOL-295: Cross product and normalization for vectors

New methods for `Vector` and `VectorX`:

- `void normalize()` to normalize a vector.
- `Vector(X) cross(const Vector(X)& v) const` to compute the cross product of two vectors.

## IOL-415: New class to create a flag system from an enum

- New template class `FlagSet` used to create a flag system from an enum.
- New macro `IOLINK_DEFINE_ENUM_BITWISE_OPERATORS(EnumType)` to create bitwise operators on enums, in association with `FlagSet`.

## IOL-409: ImageView refactoring for runtime capabilities

All `ImageView` derived classes (`ReadImageView`, `WriteImageView`, `ShapableImageView`, `MemoryImageView`) removed and their methods merged into `ImageView`.

New enum `ImageCapability` to handle `ImageView` capabilities, wrapped into the new class `ImageCapabilitySet`, using `FlagSet`. The new method `ImageView::capabilities` return an instance of this class. This should be used to check the capabilities of the view from now on.

Example to check a capability: `image->capabilities().has(ImageCapability::READ)`

Changes to `ImageViewProvider`:

- `isRead` and `toRead` removed
- `isWrite` and `toWrite` removed
- `isShapable` and `toShapable` removed
- `isMemory` and `toMemory` removed

## IOL-375: reinforce DataAccess interfaces contract

- `ReadRandomAccess::read` and `WriteRandomAccess::write` methods contract have been enriched
- `StreamAccess::good` method contract have changed and now provides a default implementation
- `StreamAccess::eof` method contract has changed
- `StreamAccess::fail` method added
- Methods contract in `ReadStreamAccess`, `WriteStreamAccess` and `SeekStreamAccess` interfaces have been enriched

## IOL-411: DataAccess refactoring to make capabilities Runtime

All `StreamAccess` derived classes (`ReadStreamAccess`, `WriteStreamAccess`, `MemoryStreamAccess`) removed and their methods merged into `StreamAccess`.

New enum `StreamAccessCapability` to handle `StreamAccess` capabilities, wrapped into the new class `StreamAccessCapabilitySet`, using `FlagSet`. The new method `StreamAccess::capabilities` return an instance of this class. This should be used to check the capabilities of the stream from now on.

Example to check a capability: `stream->capabilities().has(StreamAccessCapability::READ)`

Changes to `StreamAccessProvider`:

- `isRead` and `toRead` removed
- `isWrite` and `toWrite` removed
- `isMemory` and `toMemory` removed

All `RandomAccess` derived classes (`ReadRandomAccess`, `WriteRandomAccess`, `ResizeRandomAccess`) removed and their methods merged into `RandomAccess`.

New enum `RandomAccessCapability` to handle `RandomAccess` capabilities, wrapped into the new class `RandomAccessCapabilitySet`, using `FlagSet`. The new method `RandomAccess::capabilities` return an instance of this class. This should be used to check the capabilities of the random access from now on.

Example to check a capability: `randomAcc->capabilities().has(RandomAccessCapability::READ)`

Changes to `RandomAccessProvider`:

- `isRead` and `toRead` removed
- `isWrite` and `toWrite` removed
- `isMemory` and `toMemory` removed

## IOL-410: MultiImageView refactoring for runtime capabilities

All `MultiImageView` derived classes (`ReadMultiImageView`, `WriteMultiImageView`, `ReadWriteMultiImageView`) removed and their methods merged into `MultiImageView`.

New enum `MultiImageCapability` to handle `MultiImageView` capabilities, wrapped into the new class `MultiImageCapabilitySet`, using `FlagSet`. The new method `MultiImageView::capabilities` return an instance of this class. This should be used to check the capabilities of the view from now on.

Example to check a capability: `mimage->capabilities().has(MultiImageCapability::READ)`

Changes to `MultiImageViewProvider`:

- `isRead` and `toRead` removed
- `isWrite` and `toWrite` removed
- `isFull` and `toFull` removed

# IOLink 0.28.0 - 2021-10-07

## IOL-379: Factory to flip ImageViews

New factories in `ImageViewFactory` to flip an ImageView:

- `std::shared_ptr<ReadImageView> ImageViewFactory::flip(std::shared_ptr<ReadImageView> image, uint8_t dimensionIndex)`
- `std::shared_ptr<ReadImageView> ImageViewFactory::flip(std::shared_ptr<ReadImageView> image, ImageDimension dimension)`

## IOL-384: Update log level

- Change enum `LogLevel::OFF` to `LogLevel::LOG_OFF`
- Change enum `LogLevel::CRITICAL` to `LogLevel::LOG_CRITICAL`
- Change enum `LogLevel::ERR` to `LogLevel::LOG_ERR`
- Change enum `LogLevel::WARNING` to `LogLevel::LOG_WARNING`
- Change enum `LogLevel::INFO` to `LogLevel::LOG_INFO`
- Change enum `LogLevel::DEBUG` to `LogLevel::LOG_DEBUG`
- Change enum `LogLevel::TRACE` to `LogLevel::LOG_TRACE`

## IOL-391: Remove accessor to MemoryLayout in Indexer class

- `MemoryLayout Indexer::layout() const` removed
- `Indexer(const VectorXu64& shape, const VectorXu64& stride, const VectorXu8& order)` constructor added

# IOLink 0.27.0 - 2021-09-09

## IOL-389: Add new factory to wrap a StreamAccess into standard IOStream

- `std::shared_ptr<std::iostream> StreamAccessFactory::toStdStream(std::shared_ptr<StreamAccess> stream)` factory created

## IOL-388: Add new factory to subSample an ImageView

- `std::shared_ptr<ReadImageView> ImageViewFactory::subSample(std::shared_ptr<ReadImageView> image, uint64_t step)` factory created

## IOL-380: Support for 1D arrays

`Array` class renamed to `ArrayX`, so all the aliases have changed too. A new array class is added, `Array1`, aimed at containing 1D arrays of data. `ArrayX` now uses `Array1` internally.

## IOL-381: Add a factory to address a subset of a RandomAccess

Add factories into `RandomAcessFactory` that enable to proxy a subset of a source `RandomAccess`:

- `RandomAccessFactory::extractRegion(src, offset)`
- `RandomAccessFactory::extractRegion(src, offset, size)`

# IOLink 0.26.0 - 2021-07-22

## IOL-362: Uniformization of factories

Following methods now returns `std::shared_ptr<ReadImageView>` instead of `std::shared_ptr<ImageView>`:

- `ImageViewFactory::allocateOnDisk`
- `ImageViewFactory::loadOnDisk` both methods
- `ImageViewFactory::fromBuffer`

Following methods now takes a `std::shared_ptr<ReadStreamAccess>` instead of `std::shared_ptr<StreamAccess>`:

- `StreamAccessFactory::loadInMemory`
- `StreamAccessFactory::toStdIStream`

`StreamAccessFactory::toStdOStream` now takes a `std::shared_ptr<WriteStreamAccess>` instead of `std::shared_ptr<StreamAccess>`

Behavior change for `adaptDynamicRange` and `adaptDataType` methods. Now they don't accept type dimension modifications. An exception is raised if requested.

`MultiImageViewFactory::createMultiImageView` methods are renamed into `MultiImageViewFactory::create` new `MultiImageViewFactory::createFromList` method to create a MultiImageView from an array of `ReadImageView`

## IOL-355: New checkers for IOLink interface implementation

Added a set of checkers:

- `iolink\tool\checker\ComposedViewChecker.h`
  - `bool ComposedViewChecker::check(std::shared_ptr<ComposedView> image)` to check `ComposedView` interface implementation
- `iolink\tool\checker\DataStorageChecker.h`
  - `bool DataStorageChecker::check(std::shared_ptr<DataStorage> storage, const std::string& resourceId)` to check `DataStorage` interface implementation
- `iolink\tool\checker\ImageViewChecker.h`
  - `bool ImageViewChecker::check(std::shared_ptr<ImageView> image)` to check `ImageView` interface implementation
- `iolink\tool\checker\LodImageViewChecker.h`
  - `bool LodImageViewChecker::check(std::shared_ptr<LodImageView> image)` to check `LodImageView` interface implementation
- `iolink\tool\checker\MultiImageViewChecker.h`
  - `bool MultiImageViewChecker::check(std::shared_ptr<MultiImageView> image)` to check `MultiImageView` interface implementation
- `iolink\tool\checker\RandomAccessChecker.h`
  - `bool RandomAccessChecker::check(std::shared_ptr<RandomAccess> image)` to check `RandomAccess` interface implementation
- `iolink\tool\checker\StreamAccessChecker.h`
  - `bool StreamAccessChecker::check(std::shared_ptr<StreamAccess> image)` to check `StreamAccess` interface implementation

## IOL-364: Hide attributes of public classes

Some parameters types changed in `Indexer` to fix some issues and better fit the internal data:

- `Indexer(const VectorXu64& shape, const VectorXu64& order)` to `Indexer(const VectorXu64& shape, const VectorXu8& order)`
- `computeStride(const VectorXu64& shape, const VectorXu64& order)` to `computeStride(const VectorXu64& shape, const VectorXu8& order)`

## IOL-343: Rework of Array for interoperability

Full rework of Array class that is now only template for the value type. It can only be used with its aliases, as Vector and Region classes.

There is special NumPy interoperability function for Array in Python:

- to_numpy: to convert an Array instance to a NumPy array, without copy
- from_numpy: static method to build an Array instance from a NumPy array, copying the content of the NumPy array into the IOLink Array.

## IOL-361: Rework of ImageView API

All headers file linked to `ImageView` capabilities are now merged into `ImageView.h`, so the following headers are removed:

- `ReadImageView.h`
- `WriteImageView.h`
- `ShapableImageView.h`
- `RawMemoryView.h`
- `MemoryImageView.h`

Some modifications to `ImageView` capabilities:

- `RawMemoryView` merged into `MemoryImageView`
- New `indexer` method in `MemoryImageView` to get the memory layout of data
- Default implementation for `ImageView::dimension`
- Default implementation for `ReadImageView::read`
- Default implementation for `WriteImageView::write`
- Default implementation for `MemoryImageView::bufferSize`

# IOLink 0.25.0 - 2021-06-24

## IOL-342: new Matrix type

Adds a new `Matrix` type that is designed to do an arithmetic matrix job. Not all classic operations are implemented yet, as it is meant for interoperability first.

This class is a template one, and as its siblings `Vector` and `VectorX` its aliases must be used instead of the template class itself. These aliases follow the same pattern as vectors: Matrix3f will describe a three rows and columns square matrix stroring floats, and Matrix4d will describe a four rows and columns square matrix storing doubles.

The aliases are the following:

- Matrix3f and Matrix3d for square matrices with three columns and rows
- Matrix4f and Matrix4d for square matrices with four columns and rows

## IOL-356: Added 2 new methods to load an ImageView onto disk

- New methods `ImageViewFactory::loadOnDisk` added, with or without file path.

## IOL-312: Remove Converter method

- `ImageViewFactory::convert` method is removed You can use ImageDev for any colorspace conversion or operation on alpha channel

## IOL-346: Versioning utilities

New `Versioning` class to handle version services, as getting the version info, the version string or checking the library compatibility.

Two new constants defined in the header, in order to support these versioning utilities: `IOLINK_VERSION` and `IOLINK_VERSION_STRING`.

## IOL-336: Modify the function to import NumPy arrays

The method `NumpyInterop.from_numpy_array` is changed to have a new required argument that decribe the `ImageType` of the output `ImageView`.

The old version that only take a NumPy array cannot be used now.

# IOLink 0.23.0 - 2021-04-29

## IOL-299: Add new method to create an ImageView from a mapped file in memory.

- New method `ImageViewFactory::allocateOnDisk` that takes a file path.

## IOL-322: Add method to convert an ImageView into planar ImageView

`ImageViewFactory::disassembleChannels` new method is created `ImageViewFactory::assembleChannels` method can now manage the case when CHANNEL dimension is not in last position

## New (Returned) Mapped File Storage

When using a FileSystemStorage, the method `openRandomAccess` now works, but only for `READ_WRITE` capacities.

In addition, a new factory was added: `RandomAccessFactory::mapFile`. It maps a file in memory and returns a `RandomAccess` on it.

# IOLink 0.22.0 - 2021-03-25

## IOL-326: Add method to apply specific properties/metadata to a ReadImageView without impact on originals

- New method `ImageViewFactory::fromImageView(view, properties, metadata)`

## IOL-330: Remove resetProperties parameter from reshape method

`ShapableImageView::reshape`, `resetProperties` parameter removed

## IOL-323: Fix RandomAccessProvider method name

`RandomAccessProvider::toRead(std::shared_ptr<DataAcccess>)` -> `RandomAccessProvider::toRandom`

## IOL-310: Add units in CalibrationProperty

- New constructor in `CalibrationProperty` that take a list of strings to use as units.
- New method `CalibrationProperty::unit(index)` to get the unit for a given axis.

# IOLink 0.21.0 - 2021-02-25

## IOL-319: Improve ImageViewFactory::stack method to handle all possible cases

- New method `ImageView::stack(std::shared_ptr<ReadMultiImageView> view)` added to stack frames from a MultiImageView without specifying the new dimension
- Behavior change for `ImageView::stack(std::shared_ptr<ReadMultiImageView> view, ImageDimension newDimension)`. Method now handles all possible new dimensions.

## IOL-307: New version of Storage interface

Storage classes and subclasses all renamed to Access variants:

- `Storage` -> `DataAccess`
- `StreamStorage` -> `StreamAccess`
- `ReadStreamStorage` -> `ReadStreamAccess`
- `WriteStreamStorage` -> `WriteStreamAccess`
- `SeekStreamStorage` -> `SeekStreamAccess`
- `MemoryStreamStorage` -> `MemoryStreamAccess`
- `RandomAccessStorage` -> `RandomAccess`
- `ReadRandomAccessStorage` -> `ReadRandomAccess`
- `WriteRandomAccessStorage` -> `WriteRandomAccess`
- `SeekRandomAccessStorage` -> `SeekRandomAccess`
- `MemoryRandomAccessStorage` -> `MemoryRandomAccess`
- `StreamStorageProvider` -> `StreamAccessProvider`
- `StreamStorageFactory` -> `StreamAccessFactory`
- `RandomStorageProvider` -> `RandomAccessProvider`
- `RandomStorageFactory` -> `RandomAccessFactory`

`ImageViewFactory` method that create an `ImageView` from a `RandomAccess` now renamed from `openStorage` to `openRandomAccess`.

New `DataStorage` interface that have nothing to do with the old `Storage` one. It is used to manage and open instances of `DataAccess`. Factories method that open `DataAccess` on files now associate a storage to these accessors. `DataAccess` instances opened on HTTP resources associate a storage to these too.

You can easily open accessors relative to an already opened accessor:

auto stream = StreamAccessFactory::openFile("/home/user/folder/file.txt");
auto storage = stream->storage();
auto siblingFile = storage->openStreamAccess("sibling.txt", AccessCapabilities::READ_WRITE);

# IOLink 0.20.0 - 2021-01-29

## IOL-294: Possibility to create/allocate an in-memory stream

- `StreamStorageFactory::allocate(size_t size = 0)` creates a MemoryStreamStorage with a given size, and which is resized if necessary.
- New `MemoryStreamStorage` interface which represents a stream with all capacities (READ, WRITE, SEEK)

## IOL-309: new methods in ImageType

- `void ImageType::remove(uint8_t index)` method added to remove a dimension identified by its position in a shape
- `ImageDimension ImageType::dimension(uint8_t index) const` method added to get the ith dimension at given position in a shape

# IOLink 0.19.0 - 2021-01-07

## IOL-282: Python naming conventions

Python Method names are now lowercase, with words separated by underscores. For example, ReadImageView.readRegion() is renamed into ReadImageView.read_region().

# IOLink 0.18.0 - 2020-12-03

## IOL-273: New types for symmetric matrices

- New type interpretation: `DataTypeInterpretation::SYMMETRIC_MATRIX`
- New symmetric matrices types:
  - `DataTypeId::SYM_MATRIX2_FLOAT`
  - `DataTypeId::SYM_MATRIX2_DOUBLE`
  - `DataTypeId::SYM_MATRIX3_FLOAT`
  - `DataTypeId::SYM_MATRIX3_DOUBLE`

# IOLink 0.17.0 - 2020-11-05

## IOL-274: Deinterlace and unstack multi-channel images now provide ImageInterpretation as metadata

- `PropertyMap::clone() const` method added
- `PropertyMap::isCompatibleWith(VectorXu64 shape, DataType type) const` method added to check properties validity
- `MetadataNodeHelper::createPath(std::shared_ptr<MetadataNode> origin, const std::string& path, std::shared_ptr<VariantDataValue> value)` method added to create a metadata tree following a path string.
- `ImageType::indexDimension(ImageDimension dimension)` method added to determine dimension position in a shape
- `uint8_t SampleInfoProperty::channelCount(ImageInterpretation interpretation)` method added to give the number of channel in a specific `ImageInterpretation`.
- `ImageViewFactory::interlace(std::shared_ptr<ReadMultiImageView> multiView, ImageInterpretation newInterpretation = ImageInterpretation::UNKNOWN, bool hasAlpha = false)` method now takes an optional `hasAlpha` parameter
- `ImageViewFactory::allocate(const VectorXu64& shape, DataType type, std::shared_ptr<PropertyMap> properties = nullptr, std::shared_ptr<MetadataNode> metadata = nullptr)` method now takes optional `properties` and `metadata` as parameters
- `std::shared_ptr<ReadMultiImageView> MultiImageViewFactory::unstack(std::shared_ptr<ReadImageView> imageView, ImageDimension dimension)` method added to unstack following an `ImageDimension`

Important: In factories, properties as argument, or in given views are systematically parsed to check their validity before any processing. This helps to guarantee the behavior of IOLink services. You can activate IOLink logs for more details in case of error.

## IOL-276: Homogenize <tt>PropertyMap::fromProperties</tt> prototype with other equivalent method

- `PropertyMap::fromProperties` method now takes a reference as third parameter

## IOL-270: fromNumpyArray can directly reorder dimensions

- Python method `orderFromNumpyArray` is added to take a sequence of ImageDimension as optional argument to reorder dimensions during conversion of Numpy array into ImageView this method now returns a `ReadImageView`
- Python wrapping is upgraded to allow the creation of a MultiImageView from a list of ImageView: `MultiImageViewFactory.create`
- Python wrapping is upgraded to allow the construction of an ImageType from a list of ImageDimension

## IOL-271: Reinterpret ImageType and re-order dimensions

- new `uint64_t ImageType::dimensionCount() const` method to count the number of dimensions in an ImageType
- new `ImageType::ImageType(const ImageDimension* dimensionsList, uint8_t count)` constructor
- new `ImageType(std::initializer_list<ImageDimension> dimensionsList)` constructor
- new `static std::shared_ptr<ReadImageView> reinterpret(std::shared_ptr<ReadImageView> image, ImageType newImageType)` method to change ImageType of an ImageView
- new `static std::shared_ptr<ReadImageView> reinterpretOrder(std::shared_ptr<ReadImageView> image, const ImageDimension* dimensionsList, uint8_t count)` method to re-order dimensions and change ImageType
- `void ImageType::add(ImageDimension dimension)` is modified to only modify current object - const is removed
- `void ImageType::add(ImageType other)` is modified to only modify current object - const is removed
- `void ImageType::remove(ImageDimension dimension)` is modified to only modify current object - const is removed
- `void ImageType::remove(ImageType other)` is modified to only modify current object - const is removed

# IOLink 0.16.0 - 2020-10-09

## IOL-259: Now able to reset properties or not when reshaping a view

- `ShapableImageView::reshape` have a new argument `resetPropeties`, defaulted to `true`

## IOL-269: Method 'ImageType::has' become const

- `bool has(ImageDimension dimension)` method becomes `const`

## IOL-268: New convert method to change color space

- New `ImageViewFactory::convert` method to change the colorspace and the alpha channel of an ImageView
- New `ImageViewProvider::toReadOnly` method to return a view with only READ capacity
- New `ImageViewProvider::toWriteOnly` method to return a view with only WRITE capacity

# IOLink 0.15.0 - 2020-09-08

## IOL-262: Add loadInMemory method for StreamStorages

- New `StreamStorageFactory::loadInMemory` method

## IOL-260: Add peek for IStreams

- New `IStreamStorage::peek` method

# IOLink 0.14.0 - 2020-08-13

## IOL-234: Properties MkII

- Removed `CalibrationProperty::isDefault`
- New property class `ComponentInfoProperty`
- Removed enum `ImageChannel`
- Reworked `SampleInfoProperty`, only `interpretation` and `hasAlpha` fields remain
- New `ImageDimension` enum
- Removed `DimensionInterpreation` enum
- New `ImageType` flag system for image dimensions description
- Reworked `DimensionInfoProperty`, only a field `type` remain
- `PropertyMap` is now a class, and is mainly rewamped.
- `PropertyMap` is now immutable, a copy must be made to modify it
- New method `WriteImageView::setProperties`
- Change to `ReadImageView::properties()`, it now returns a `std::shared_ptr<const PropertyMap>`
- Method `ImageViewFactory::stack` change to take an `ImageDimension` instead of a `Dimensioninterpretation`
- Removed `ImageViewFactory::extractChannel` variant that used an `ImageChannel`

# IOLink 0.13.0 - 2020-07-15

## IOL-245: Add a 'slice' method for Region and RegionX

- New `Region::slice` method
- New `RegionX::slice` method

## IOL-244 : new Writer interface

- MetadataValue interface is replaced by VariantDataValue (it allows to store any values, and not only for metadata) its header is no more in iolink/metadata, but directly in iolink/
- Writer interface contains 3 new virtual methods

## IOL-236: Correct ImageInterpretations values

- `CIE_XYZ_CHROMACITY` renamed to `CIE_XYZ_CHROMATICITY`
- `RGB_CHROMACITY` renamed to `RGB_CHROMATICITY`
- `YUV` is now different from `YCC`
- `HSB` removed as it is an alias of `HSV`
- `CMYK` added

## IOL-228: New public logging interface

- Remove `void Logger::setLevel(LogLevel level)`
- Remove `void Logger::setFlushLevel(LogLevel level)`
- Add `void Logger::init(LogeLevel level)`
- Add `LogLevel Logger::logLevel()`

## IOL-238 : Added provider for LodImageView

- LodImageViewProvider now provides services for LodImageView
- C# wrapping for LodImageViewProvider

## IOL-232 : User friendly ImageViewFactory.Uniform in C#

- MetadataValueConverter now provides a toString method to convert any metadata into a string
- C# wrapping of the helper MetadataValueConverter
- ImageViewFactory.Uniform takes a System.Object as value instead of System.IntPtr

# IOLink 0.12 - 2020-06-18

## VectorX API consistency: pass VectorXu64 by reference when possible

- `ImageView::shape` now returns a `const VectorXu64&`
- `ReadImageView::read` and `WriteImageView::write` take a `const VectorXu64&` as index
- `ImageViewFactory::fromStorage` take a `const VectorXu64&` as shape
- `RegionX::origin` and `RegionX::size` now returns `const VectorXu64&`

# IOLink 0.11 - 2020-05-19

## IOL-182 : Factory to interlace MultiImageView instances

- Add new overload of `MultiImageViewFactory::createMultiImageView` that takes an initializer list
- New `ImageViewFactory::interlace` method to interlace MultiImageView instances into ImageView instances
- Add equality and inequality operators for `CalibrationProperty`
- Add equality and inequality operators for `DimensionInfoProperty`