Commit 71e5c7e7 authored by Michaël Roynard's avatar Michaël Roynard

Merge branch 'dev' into 'master'

Finishing views

See merge request !8
parents 303534b3 e7d62d83
Pipeline #3398 failed with stages
in 2 minutes and 40 seconds
Param(
[String]$Compiler = "gcc",
[String]$CmakeGenerator = "Ninja",
[String]$BuildDirectory = "build-in-docker",
[String]$SourceDirectory = "..",
[String]$Target = "",
[String]$Clean = "OFF"
[String]$ConfigType = "Debug",
[String]$Clean = "OFF",
[String]$ConanUser = "dutiona",
[String]$ConanRepoName = "dutiona-lrde",
[String]$ConanRepoURL = "https://api.bintray.com/conan/dutiona/lrde",
[String]$ConanAPIKey = "e2a665548385e82bf1ecbb4739d3582b83b8235f"
)
$DockerImageToolset = "mroynard/ubuntu-doctoolset:local"
$ConanProfile = "$Compiler-$ConfigType".ToLower()
Write-Host "Compiler: $Compiler"
Write-Host "CmakeGenerator: $CmakeGenerator"
Write-Host "BuildDirectory: $BuildDirectory"
Write-Host "SourceDirectory: $SourceDirectory"
Write-Host "Target: $Target"
Write-Host "ConfigType: $ConfigType"
Write-Host "Clean: $Clean"
Write-Host "ConanUser: $ConanUser"
Write-Host "ConanRepoName: $ConanRepoName"
Write-Host "ConanRepoURL: $ConanRepoURL"
Write-Host "ConanAPIKey: $ConanAPIKey"
Write-Host "ConanProfile: $ConanProfile"
Write-Host "DockerImageToolset: $DockerImageToolset"
# compiler switch
If($Compiler -eq "gcc") {
$CC = "gcc"
$CXX = "g++"
}
Else {
$CC = "clang"
$CXX = "clang++"
}
# starting container
$PwdPath = (Get-Location).Path
$ContainerID = docker run -itd --rm --mount type=bind,source="$PwdPath",target=/workspace mroynard/ubuntu-doctoolset:local
Write-Host "*** BUILDING BINARIES ***"
$ContainerID = docker run -itd --privileged --rm --mount type=bind,source="$PwdPath",target=/workspace $DockerImageToolset
Write-Host "Running in container $ContainerID"
Trap {
docker exec $ContainerID true
......@@ -32,8 +61,20 @@ If ($Clean -eq "ON") {
}
# configure & make
docker exec --workdir $Workdir $ContainerID sh -c "cmake -G $CmakeGenerator $SourceDirectory"
docker exec --workdir $Workdir $ContainerID sh -c "cmake --build . --target $Target"
$DockerCmd = @"
export CC=$CC && \
export CXX=$CXX && \
$CXX --version && \
conan remote add $ConanRepoName $ConanRepoURL && \
conan user -p $ConanAPIKey -r $ConanRepoName $ConanUser && \
conan remote list && \
conan install .. --build missing -pr $ConanProfile && \
cmake $CmakeGenerator -DWITH_TESTS=ON $SourceDirectory &&
cmake --build . --target $Target --config $ConfigType && \
ctest -C $ConfigType --output-on-failure --schedule-random --verbose
"@
docker exec -w $Workdir $ContainerID sh -c "$DockerCmd"
# stopping container
Write-Host "Stopping container $ContainerID"
......
Domain concepts
===============
Domain concepts (details)
=========================
.. contents:: Table of Contents
:local:
......@@ -59,7 +59,7 @@ Domain
.. code:: cpp
template<typename D, Dom = remove_cvref<D>>
concept Domain = requires Regular<Dom> &&
concept Domain = Regular<Dom> &&
requires {
typename Dom::point_type;
......@@ -67,14 +67,14 @@ Domain
typename Dom::codomain_type;
} &&
requires Point<Dom::point_type> &&
requires BidirectionalRange<Dom::const_point_range> &&
requires Value<Dom::codomain_type> &&
Point<Dom::point_type> &&
BidirectionalRange<Dom::const_point_range> &&
Value<Dom::codomain_type> &&
requires Same<const Dom::point_type, Dom::const_point_range::value_type> &&
Same<const Dom::point_type, Dom::const_point_range::value_type> &&
requires False<is_const_v<Dom::codomain_type> &&
requires FaLse<is_reference_v<Dom::codomain_type> &&
!is_const_v<Dom::codomain_type> &&
!is_reference_v<Dom::codomain_type> &&
requires(const Dom cdom, Dom::point_type p) {
{ cdom.has(p) } -> bool;
......
Extension concepts
==================
\ No newline at end of file
Extension concepts (details)
============================
\ No newline at end of file
Image concepts
==============
Image concepts (details)
========================
.. contents:: Table of Contents
:local:
......@@ -72,25 +72,25 @@ Image
typename Ima::const_value_range;
} &&
requires Pixel<Ima::pixel_type> &&
requires Point<Ima::point_type> &&
requires Value<Ima::value_type> &&
requires Domain<Ima::domain_type> &&
requires Index<Ima::index_type> &&
requires SignedIntegral<Ima::difference_type> &&
requires ForwardRange<Ima::const_pixel_range> &&
requires ForwardRange<Ima::const_value_range> &&
requires Same<Ima::difference_type, decltype(Ima::index_type() - Ima::index_type())> &&
requires Same<Ima::point_type, Ima::pixel_type::point_type> &&
requires Same<Ima::value_type, Ima::pixel_type::value_type> &&
requires Same<Ima::const_reference, const Ima::pixel_type::reference> &&
requires Same<Ima::const_pixel_type, const Ima::pixel_type> &&
requires Same<Ima::const_pixel_type, Ima::const_pixel_range::value_type> &&
requires Same<Ima::const_reference, Ima::const_value_range::value_type> &&
requires False<is_const_v<Ima::value_type> &&
requires FaLse<is_reference_v<Ima::value_type> &&
Pixel<Ima::pixel_type> &&
Point<Ima::point_type> &&
Value<Ima::value_type> &&
Domain<Ima::domain_type> &&
Index<Ima::index_type> &&
SignedIntegral<Ima::difference_type> &&
ForwardRange<Ima::const_pixel_range> &&
ForwardRange<Ima::const_value_range> &&
Same<Ima::difference_type, decltype(Ima::index_type() - Ima::index_type())> &&
Same<Ima::point_type, Ima::pixel_type::point_type> &&
Same<Ima::value_type, Ima::pixel_type::value_type> &&
Same<Ima::const_reference, const Ima::pixel_type::reference> &&
Same<Ima::const_pixel_type, const Ima::pixel_type> &&
Same<Ima::const_pixel_type, Ima::const_pixel_range::value_type> &&
Same<Ima::const_reference, Ima::const_value_range::value_type> &&
!is_const_v<Ima::value_type> &&
!is_reference_v<Ima::value_type> &&
requires( Ima ima, const Ima cima, Ima::domain_type d,
Ima::index_type k, Ima::point_type p) {
......@@ -152,8 +152,8 @@ ConcreteImage
.. code:: cpp
template <typename ConcIm, ConcIma = remove_cvref<ConcIm>>
concept ConcreteImage = requires Semiregular<ConcIma> &&
requires Image<ConcIma> &&
concept ConcreteImage = Semiregular<ConcIma> &&
Image<ConcIma> &&
requires( ConcIma ima, ConcIma::domain_type d,
ConcIma::index_type k, ConcIma::value_type v) {
......@@ -204,14 +204,14 @@ WritableImage
typename WIma::value_range;
} &&
requires ForwardRange<WIma::pixel_range> &&
requires ForwardRange<WIma::value_range> &&
requires OutputRange<WIma::pixel_range, WIma::pixel_type> &&
requires OutputRange<WIma::value_range, WIma::value_type> &&
ForwardRange<WIma::pixel_range> &&
ForwardRange<WIma::value_range> &&
OutputRange<WIma::pixel_range, WIma::pixel_type> &&
OutputRange<WIma::value_range, WIma::value_type> &&
requires Same<WIma::reference, WIma::pixel_type::reference> &&
requires Same<WIma::pixel_type, WIma::pixel_range::value_type> &&
requires Same<WIma::reference, WIma::value_range::value_type> &&
Same<WIma::reference, WIma::pixel_type::reference> &&
Same<WIma::pixel_type, WIma::pixel_range::value_type> &&
Same<WIma::reference, WIma::value_range::value_type> &&
requires(WIma wima, WIma::index_type k, WIma::domain_type d, WIma::value_type v) {
{ wima[k] } -> WIma::reference;
......@@ -223,7 +223,7 @@ WritableImage
.. _concept-details-BidirectionalImage:
BidirectionalImage
-------------------
------------------
.. cpp:concept:: template <typename BidirIma> BidirectionalImage
......@@ -244,17 +244,17 @@ BidirectionalImage
concept BidirectionalImage =
Image<BidirIma> &&
requires BidirectionalRange<BidirIma::const_pixel_range> &&
requires BidirectionalRange<BidirIma::const_value_range> &&
BidirectionalRange<BidirIma::const_pixel_range> &&
BidirectionalRange<BidirIma::const_value_range> &&
requires Same<BidirIma::const_pixel_type, BidirIma::const_pixel_range::value_type> &&
requires Same<BidirIma::const_reference, BidirIma::const_value_range::value_type>;
Same<BidirIma::const_pixel_type, BidirIma::const_pixel_range::value_type> &&
Same<BidirIma::const_reference, BidirIma::const_value_range::value_type>;
.. _concept-details-WritableBidirectionalImage:
WritableBidirectionalImage
---------------------------
--------------------------
.. cpp:concept:: template <typename WBidirIma> WritableBidirectionalImage
......@@ -277,11 +277,11 @@ WritableBidirectionalImage
WritableImage<WBidirIma> &&
BidirectionnalImage<WBidirIma> &&
requires BidirectionalRange<WBidirIma::pixel_range> &&
requires BidirectionalRange<WBidirIma::value_range> &&
BidirectionalRange<WBidirIma::pixel_range> &&
BidirectionalRange<WBidirIma::value_range> &&
requires Same<WBidirIma::pixel_type, WBidirIma::pixel_range::value_type> &&
requires Same<WBidirIma::reference, WBidirIma::value_range::value_type>;
Same<WBidirIma::pixel_type, WBidirIma::pixel_range::value_type> &&
Same<WBidirIma::reference, WBidirIma::value_range::value_type>;
.. _concept-details-AccessibleImage:
......@@ -397,13 +397,13 @@ RandomAccessImage
BidirectionalImage<RndAccIma> &&
AccessibleImage<RndAccIma> &&
requires RandomAccessRange<RndAccIma::const_pixel_range> &&
requires RandomAccessRange<RndAccIma::const_value_range> &&
requires SizedRange<WRndAccIma::const_pixel_range> &&
requires SizedRange<WRndAccIma::const_value_range> &&
RandomAccessRange<RndAccIma::const_pixel_range> &&
RandomAccessRange<RndAccIma::const_value_range> &&
SizedRange<WRndAccIma::const_pixel_range> &&
SizedRange<WRndAccIma::const_value_range> &&
requires Same<RndAccIma::const_pixel_type, RndAccIma::const_pixel_range::value_type> &&
requires Same<RndAccIma::const_reference, RndAccIma::const_value_range::value_type>;
Same<RndAccIma::const_pixel_type, RndAccIma::const_pixel_range::value_type> &&
Same<RndAccIma::const_reference, RndAccIma::const_value_range::value_type>;
.. _concept-details-WritableRandomAccessImage:
......@@ -430,14 +430,14 @@ WritableRandomAccessImage
template <typename WRndAccIm, WRndAccIma = remove_cvref<WRndAccIm>>
concept WritableRandomAccessImage =
requires WritableBidirectionalImage<WRndAccIma> &&
requires WritableAccessibleImage<WRndAccIma> &&
requires RandomAccessImage<WRndAccIma> &&
requires RandomAccessRange<WRndAccIma::pixel_range> &&
requires RandomAccessRange<WRndAccIma::value_range> &&
requires SizedRange<WRndAccIma::pixel_range> &&
requires SizedRange<WRndAccIma::value_range> &&
WritableBidirectionalImage<WRndAccIma> &&
WritableAccessibleImage<WRndAccIma> &&
RandomAccessImage<WRndAccIma> &&
RandomAccessRange<WRndAccIma::pixel_range> &&
RandomAccessRange<WRndAccIma::value_range> &&
SizedRange<WRndAccIma::pixel_range> &&
SizedRange<WRndAccIma::value_range> &&
requires Same<WRndAccIma::pixel_type, WRndAccIma::pixel_range::value_type> &&
requires Same<WRndAccIma::reference, WRndAccIma::value_range::value_type>;
Same<WRndAccIma::pixel_type, WRndAccIma::pixel_range::value_type> &&
Same<WRndAccIma::reference, WRndAccIma::value_range::value_type>;
Index concepts
==============
Index concepts (details)
========================
.. contents:: Table of Contents
:local:
......@@ -39,4 +39,4 @@ Index
.. code:: cpp
template<typename Idx>
concept Index = requires UnsignedIntegral<Idx>;
concept Index = Integral<Idx>;
Neighborhood concepts
=====================
\ No newline at end of file
Neighborhood concepts (details)
===============================
\ No newline at end of file
Pixel concepts
==============
Pixel concepts (details)
========================
.. contents:: Table of Contents
:local:
......@@ -71,16 +71,16 @@ Pixel
typename Pix::reference;
} &&
requires Value<Pix::value_type> &&
requires Point<Pix::point_type> &&
requires Image<Pix::image_type> &&
Value<Pix::value_type> &&
Point<Pix::point_type> &&
Image<Pix::image_type> &&
requires Same<Pix::value_type, Pix::image_type::value_type> &&
requires Same<Pix::point_type, Pix::image_type::point_type> &&
requires Same<Pix::reference, Pix::image_type::reference> &&
Same<Pix::value_type, Pix::image_type::value_type> &&
Same<Pix::point_type, Pix::image_type::point_type> &&
Same<Pix::reference, Pix::image_type::reference> &&
requires False<is_const_v<Pix::value_type> &&
requires FaLse<is_reference_v<Pix::value_type> &&
!is_const_v<Pix::value_type> &&
!is_reference_v<Pix::value_type> &&
requires(const Pix cpix, Pix pix) {
{ cpix.value() } -> const reference;
......@@ -108,13 +108,13 @@ TransformedPixel
template< typename TP, typename FP,
ToPix = remove_cvref<TP>, FromPix = remove_cvref<FP>>
concept TransformedPixel = requires Pixel<ToPix> &&
requires Pixel<FromPix> &&
concept TransformedPixel = Pixel<ToPix> &&
Pixel<FromPix> &&
requires {
typename ToPix::from_pixel_type
} &&
requires Same<ToPix::from_pixel_type, FromPix>;
Same<ToPix::from_pixel_type, FromPix>;
.. _concept-details-ProjectedPixel:
......@@ -124,31 +124,14 @@ ProjectedPixel
.. cpp:concept:: template <typename ToPix, typename FromPix> ProjectedPixel
#. Refines the :cpp:concept:`template <typename Pix> Pixel` concept.
#. Refines the :cpp:concept:`template <typename ToPix, typename FromPix> TransformedPixel` concept.
**Notation**
.. cpp:type:: PPix
.. cpp:type:: from_pixel_type = PPix::from_pixel_type
.. cpp:var:: PPix toPix
.. cpp:var:: from_pixel_type fromPix
**Valid Expressions**
- :cpp:expr:`fromPix(toPix)` returns :cpp:expr:`from_pixel_type`.
- :cpp:expr:`fromPix(move(toPix))` returns :cpp:expr:`from_pixel_type`.
- :cpp:expr:`fromPix = toPix` returns :cpp:expr:`from_pixel_type&`.
- :cpp:expr:`fromPix = move(toPix)` returns :cpp:expr:`from_pixel_type&`.
- :cpp:expr:`static_cast<from_pixel_type>(toPix)` returns :cpp:expr:`from_pixel_type&&`.
**Possible implementation**
.. code:: cpp
template<typename ToPix, typename FromPix, PPix = remove_cvref<ToPix>>
concept ProjectedPixel = requires TransformedPixel<ToPix, FromPix> &&
requires ConvertibleTo<ToPix, FromPix>;
concept ProjectedPixel = TransformedPixel<ToPix, FromPix>;
.. _concept-details-ZippedPixel:
......@@ -172,13 +155,13 @@ ZippedPixel
template< typename ZP, typename... FromPixs,
ZPix = remove_cvref<ZPix>>
concept ZippedPixel =
requires Pixel<ZPix> &&
requires Pixel<FromPixs>... &&
Pixel<ZPix> &&
Pixel<FromPixs>... &&
requires {
typename ZPix::zipped_pixel_type_list<FromPixs...>
} &&
requires ConvertibleTo<
ConvertibleTo<
ZPix::zipped_pixel_type_list<FromPixs...>,
basic_type_list<FromPixs...>>;
Point concepts
==============
Point concepts (details)
========================
.. contents:: Table of Contents
:local:
......@@ -51,5 +51,5 @@ Point
.. code:: cpp
template<typename Pnt>
concept Point = requires Regular<Pnt> &&
requires StrictTotallyOrdered<Pnt>;
concept Point = Regular<Pnt> &&
StrictTotallyOrdered<Pnt>;
Range concepts
==============
Range concepts (details)
========================
.. contents:: Table of Contents
:local:
......@@ -45,7 +45,7 @@ Range
.. code:: cpp
template<typename R, Rng = remove_cvref<R>>
concept Range = requires Semiregular<Rng> &&
concept Range = Semiregular<Rng> &&
requires(Rng rng, const Rng crng) {
{ rng.begin() } -> /* implementation defined */;
......@@ -83,8 +83,8 @@ SizedRange
inline constexpr bool disable_sized_range = /* implementation defined */;
template<typename R, SRng = remove_cvref<R>>
concept SizedRange = requires Range<SRng> &&
requires False<disable_sized_range<SRng>> &&
concept SizedRange = Range<SRng> &&
!disable_sized_range<SRng> &&
requires(const SRng csrng) {
{ csrng.size() } -> Rng::iterator_type::difference_type;
......@@ -121,13 +121,13 @@ InputRange
.. code:: cpp
template<typename R, Rng = remove_cvref<R>>
concept InputRange = requires Range<Rng> &&
concept InputRange = Range<Rng> &&
requires {
typename Rng::iterator_type;
} &&
requires InputIterator<Rng::iterator_type>;
InputIterator<Rng::iterator_type>;
.. _concept-details-OutputRange:
......@@ -165,13 +165,13 @@ OutputRange
.. code:: cpp
template<typename R, typename T, Rng = remove_cvref<R>>
concept OutputRange = requires Range<Rng> &&
concept OutputRange = Range<Rng> &&
requires {
typename Rng::iterator_type;
} &&
requires OuputIterator<Rng::iterator_type, T>;
OuputIterator<Rng::iterator_type, T>;
.. _concept-details-ForwardRange:
......@@ -207,14 +207,14 @@ ForwardRange
.. code:: cpp
template<typename R, FwdRng = remove_cvref<R>>
concept ForwardRange = requires InputRange<FwdRng> &&
requires ForwardIterator<FwdRng::iterator_type> &&
concept ForwardRange = InputRange<FwdRng> &&
ForwardIterator<FwdRng::iterator_type> &&
requires {
typename FwdRng::value_type;
} &&
requires Same<FwdRng::value_type, FwdRng::iterator_type::value_type>;
Same<FwdRng::value_type, FwdRng::iterator_type::value_type>;
.. _concept-details-BidirectionalRange:
......@@ -251,8 +251,8 @@ BidirectionalRange
.. code:: cpp
template<typename R, BidirRng = remove_cvref<R>>
concept BidirectionalRange = requires ForwardRange<BidirRng> &&
requires BidirectionalIterator<BidirRng::iterator_type> &&
concept BidirectionalRange = ForwardRange<BidirRng> &&
BidirectionalIterator<BidirRng::iterator_type> &&
requires(BidirRng bidirrng, const BidirRng cbidirrng) {
{ bidirrng.rbegin() } -> /* implementation defined */;
......@@ -302,5 +302,5 @@ RandomAccessRange
.. code:: cpp
template<typename R, RndAccRng = remove_cvref<R>>
concept RandomAccessRange = requires BidirectionalRange<RndAccRng> &&
requires RandomAccessIterator<RndAccRng::iterator_type>;
concept RandomAccessRange = BidirectionalRange<RndAccRng> &&
RandomAccessIterator<RndAccRng::iterator_type>;
Value concepts
==============
Value concepts (details)
========================
.. contents:: Table of Contents
:local:
......@@ -19,7 +19,7 @@ Value
.. code:: cpp
template<typename Val>
concept Value = requires SemiregularValue<Val>;
concept Value = SemiregularValue<Val>;
.. _concept-details-SemiregularValue:
......@@ -56,7 +56,7 @@ SemiregularValue
.. code:: cpp
template<typename SemiregVal>
concept SemiregularValue = requires Semiregular<SemiregVal>;
concept SemiregularValue = Semiregular<SemiregVal>;
.. _concept-details-RegularValue:
......@@ -86,8 +86,8 @@ RegularValue
.. code:: cpp
template<typename RegVal>
concept RegularValue = requires SemiregularValue<RegVal> &&
requires Regular<RegVal>;
concept RegularValue = SemiregularValue<RegVal> &&
Regular<RegVal>;
.. _concept-details-StrictTotallyOrderedRegularValue:
......@@ -117,5 +117,5 @@ StrictTotallyOrderedRegularValue
.. code:: cpp
template<typename STORegVal>
concept RegularValue = requires RegularValue<STORegVal> &&
requires StrictTotallyOrdered<STORegVal>;
concept RegularValue = RegularValue<STORegVal> &&
StrictTotallyOrdered<STORegVal>;
View concepts
=============
View concepts (details)
=======================
.. contents:: Table of Contents
:local:
......@@ -20,7 +20,7 @@ View
.. code:: cpp
template <typename V, Vw = remove_cvref<V>>
concept View = requires Image<Vw>;
concept View = Image<Vw>;
.. _concept-details-WritableView:
......@@ -38,8 +38,8 @@ WritableView
.. code:: cpp
template <typename WV, WView = remove_cvref<WV>>
concept WritableView = requires View<WView> &&
requires WritableImage<WView>;
concept WritableView = View<WView> &&
WritableImage<WView>;
.. _concept-details-FilterView:
......@@ -67,8 +67,8 @@ FilterView
.. code:: cpp
template <typename FV, typename Pred, FView = remove_cvref<FV>>
concept FilterView = requires View<FView> &&
requires Predicate<Pred, FView::const_pixel_type>;
concept FilterView = View<FView> &&
Predicate<Pred, FView::const_pixel_type>;
.. _concept-details-WritableFilterView:
......@@ -97,9 +97,9 @@ WritableFilterView
.. code:: cpp
template <typename WFV, typename Pred, WFView = remove_cvref<WFV>>
concept WritableFilterView = requires WritableView<WFView> &&
requires FilterView<WFView, Pred> &&
requires Predicate<Pred, WFView::pixel_type>;
concept WritableFilterView = WritableView<WFView> &&
FilterView<WFView, Pred> &&
Predicate<Pred, WFView::pixel_type>;
.. _concept-details-TransformView:
......@@ -109,7 +109,7 @@ TransformView
.. cpp:concept:: template <typename TView, typename Func> TransformView
#. Refines the :cpp:concept:`template <typename V> View` concept.
#. ``Func`` models the :cpp:concept:`template <typename R, typename F, typename... Args> InvocableR` concept where ``R`` models the :cpp:concept:`template <typename ToPix, typename FromPix> TransformedPixel` concept.
#. ``Func`` models the :cpp:concept:`template <typename R, typename F, typename... Args> InvocableR` concept.
**Notation**
......@@ -119,16 +119,16 @@ TransformView
**Valid Expressions**
- :cpp:expr:`func(cpix)` return-type models the :cpp:concept:`template <typename ToPix, typename FromPix> TransformedPixel` concept.
- :cpp:expr:`func(cpix)` return-type models the :cpp:concept:`template <typename ToPix, typename FromPix> TransformedPixel` concept with `ToPix = decltype(func(cpix))` and `FromPix = TView::const_pixel_type`.
**Possible implementation**
.. code:: cpp
template <typename TV, typename Func, TView = remove_cvref<TV>>
concept TransformView = requires View<TView> &&
requires Invocable<Func, TView::const_pixel_type> &&
requires TransformedPixel<
concept TransformView = View<TView> &&
Invocable<Func, TView::const_pixel_type> &&
TransformedPixel<
invoke_result_t<Func, TView::const_pixel_type>,
TView::const_pixel_type>;
......@@ -140,9 +140,8 @@ WritableTransformView
.. cpp:concept:: template <typename WTView, typename Func, typename FuncInverse> WritableTransformView
#. Refines the :cpp:concept:`template <typename V> View` concept.
#. Refines the :cpp:concept:`template <typename TView, typename Func> TransformView` concept.
#. ``Func`` models the :cpp:concept:`template <typename R, typename F, typename... Args> InvocableR` concept where ``R`` models the :cpp:concept:`template <typename ToPix, typename FromPix> TransformedPixel` concept.
#. ``Func`` models the :cpp:concept:`template <typename R, typename F, typename... Args> InvocableR` concept.
#. ``FuncInverse`` models the :cpp:concept:`template <typename R, typename F, typename... Args> InvocableR` concept where ``R`` models the :cpp:concept:`template <typename Pix> Pixel` concept.
**Notation**
......@@ -154,7 +153,7 @@ WritableTransformView