Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
Olena
pylene
Commits
0b5a9f2d
Commit
0b5a9f2d
authored
Feb 04, 2019
by
Michaël Roynard
Browse files
Green branch
parent
7c26cbb5
Pipeline
#12890
failed with stages
in 6 minutes and 51 seconds
Changes
3
Pipelines
2
Hide whitespace changes
Inline
Side-by-side
pylene/include/mln/core/concept/new/domains.hpp
View file @
0b5a9f2d
...
...
@@ -23,7 +23,6 @@ namespace mln::concepts
requires
(
const
Dom
cdom
,
::
ranges
::
range_value_t
<
Dom
>
p
)
{
{
cdom
.
has
(
p
)
}
->
bool
;
{
cdom
.
empty
()
}
->
bool
;
// { cdom.size() } -> stl::UnsignedIntegral&&;
};
...
...
pylene/include/mln/core/image/view/filter.hpp
View file @
0b5a9f2d
...
...
@@ -2,6 +2,7 @@
#include <mln/core/image/image.hpp>
#include <mln/core/image/view/adaptor.hpp>
#include <mln/core/image/view/clip.hpp>
#include <mln/core/rangev3/view/filter.hpp>
#include <mln/core/rangev3/view/remove_if.hpp>
...
...
@@ -24,37 +25,38 @@ namespace mln
public:
/// Type definitions
/// \{
using
typename
filter_view
::
image_adaptor
::
new
_pixel_t
ype
;
using
new_pixel_type
=
image
_pixel_t
<
I
>
;
using
typename
filter_view
::
image_adaptor
::
point_type
;
using
typename
filter_view
::
image_adaptor
::
reference
;
using
typename
filter_view
::
image_adaptor
::
value_type
;
class
domain_type
{
using
fun_t
=
::
ranges
::
semiregular_t
<
F
>
;
using
dom_t
=
decltype
(
std
::
declval
<
I
*>
()
->
domain
());
using
rng_t
=
mln
::
ranges
::
remove_if_view
<::
ranges
::
view
::
all_t
<
dom_t
>
,
::
ranges
::
logical_negate
<
fun_t
>>
;
using
fun_t
=
::
ranges
::
semiregular_t
<
F
>
;
using
pred_t
=
::
ranges
::
composed
<
F
,
std
::
reference_wrapper
<
I
>>
;
// f o I::operator()
using
dom_t
=
decltype
(
std
::
declval
<
I
*>
()
->
domain
());
using
rng_t
=
mln
::
ranges
::
remove_if_view
<::
ranges
::
view
::
all_t
<
dom_t
>
,
::
ranges
::
logical_negate
<
pred_t
>>
;
rng_t
rng_
;
I
*
ima_
;
fun_t
f_
;
pred_t
pred_
;
mutable
rng_t
rng_
;
// domain can be a range, so non-const
static_assert
(
::
ranges
::
ForwardRange
<
rng_t
>
());
public:
//
using value_type = ::ranges::range_value_t<rng_t>;
//
using reference = ::ranges::range_reference_t<rng_t>;
using
value_type
=
::
ranges
::
range_value_t
<
rng_t
>
;
using
reference
=
::
ranges
::
range_reference_t
<
rng_t
>
;
domain_type
(
I
*
ima
,
F
f
)
:
rng_
(
mln
::
ranges
::
view
::
filter
(
ima
->
domain
(),
std
::
move
(
f
)))
,
ima_
(
ima
)
,
f_
(
std
::
move
(
f
))
:
pred_
(
std
::
move
(
f
),
std
::
ref
(
*
ima
))
,
rng_
(
mln
::
ranges
::
view
::
filter
(
ima
->
domain
(),
pred_
))
{
}
auto
begin
()
{
return
::
ranges
::
begin
(
rng_
);
}
auto
end
()
{
return
::
ranges
::
end
(
rng_
);
}
auto
begin
()
const
{
return
::
ranges
::
begin
(
rng_
);
}
auto
end
()
const
{
return
::
ranges
::
end
(
rng_
);
}
bool
has
(
value
_type
p
)
const
{
return
f_
((
*
ima_
)
(
p
)
)
;
}
bool
empty
()
const
{
return
::
ranges
::
empty
(
rng_
);
}
bool
has
(
point
_type
p
)
const
{
return
pred_
(
p
);
}
bool
empty
()
const
{
return
this
->
begin
()
==
this
->
end
();
/*
::ranges::empty(rng_);
*/
}
};
/// \}
...
...
@@ -66,11 +68,15 @@ namespace mln
using
view
=
std
::
true_type
;
// May be too restrictive (might be extended by image)
using
extension_category
=
mln
::
extension
::
none_extension_tag
;
using
concrete_type
=
void
;
// This image has no automatic concrete
type
using
concrete_type
=
clip_view
<
image_concrete_t
<
I
>
,
domain_
type
>
;
template
<
class
V
>
using
ch_value_type
=
void
;
// This image has no automatic concrete
type
using
ch_value_type
=
clip_view
<
image_ch_value_t
<
I
,
V
>
,
domain_
type
>
;
/// \}
// Checks
// FIXME: accessible prerequisite
// FIXME: can be indexable
static_assert
(
::
ranges
::
ForwardRange
<
rng_t
>
());
private:
struct
pix_filter_fn
...
...
@@ -92,8 +98,18 @@ namespace mln
{
}
internal
::
initializer
<
concrete_type
,
clip_view
<
I
,
domain_type
>>
concretize
()
const
{
return
mln
::
clip_view
{
this
->
base
(),
domain
()};
}
template
<
typename
V
>
internal
::
initializer
<
ch_value_type
<
V
>
,
clip_view
<
I
,
domain_type
>>
ch_value
()
const
{
return
mln
::
clip_view
{
this
->
base
(),
domain
()};
}
domain_type
domain
()
const
{
return
{
&
this
->
base
(),
this
->
f
};
}
domain_type
domain
()
const
{
return
{
const_cast
<
I
*>
(
&
this
->
base
()
)
,
this
->
f
};
}
auto
new_values
()
{
return
mln
::
ranges
::
view
::
filter
(
this
->
base
().
new_values
(),
f
);
}
...
...
tests/core/image/view/filter.cpp
View file @
0b5a9f2d
...
...
@@ -38,11 +38,13 @@ TEST(View, filter_readonly)
static_assert
(
concepts
::
OutputImage
<
decltype
(
x
)
>
);
static_assert
(
concepts
::
Image
<
decltype
(
x
)
>
);
static_assert
(
concepts
::
ViewImage
<
decltype
(
x
)
>
);
static_assert
(
concepts
::
IndexableAndAccessibleImage
<
decltype
(
x
)
>
);
static_assert
(
not
concepts
::
BidirectionalImage
<
decltype
(
x
)
>
);
// FIXME
static_assert
(
not
concepts
::
IndexableAndAccessibleImage
<
decltype
(
x
)
>
);
static_assert
(
concepts
::
BidirectionalImage
<
decltype
(
x
)
>
);
static_assert
(
not
concepts
::
RawImage
<
decltype
(
x
)
>
);
#endif // PYLENE_CONCEPT_TS_ENABLED
ASSERT_TRUE
(
mln
::
experimental
::
all_of
(
x
>
10
));
mln_foreach_new
(
auto
&&
pix
,
ima
.
new_pixels
())
...
...
@@ -69,13 +71,15 @@ TEST(View, filter_writable)
mln
::
experimental
::
iota
(
ima
,
0
);
auto
x
=
mln
::
view
::
filter
(
ima
,
[](
int
v
)
{
return
v
>
10
;
});
#ifdef PYLENE_CONCEPT_TS_ENABLED
static_assert
(
concepts
::
OutputImage
<
decltype
(
x
)
>
);
static_assert
(
concepts
::
ViewImage
<
decltype
(
x
)
>
);
static_assert
(
concepts
::
IndexableAndAccessibleImage
<
decltype
(
x
)
>
);
static_assert
(
not
concepts
::
BidirectionalImage
<
decltype
(
x
)
>
);
static_assert
(
not
concepts
::
RawImage
<
decltype
(
x
)
>
);
#endif // PYLENE_CONCEPT_TS_ENABLED
/*
#ifdef PYLENE_CONCEPT_TS_ENABLED
static_assert(concepts::OutputImage<decltype(x)>);
static_assert(concepts::ViewImage<decltype(x)>);
static_assert(concepts::IndexableAndAccessibleImage<decltype(x)>);
static_assert(not concepts::BidirectionalImage<decltype(x)>);
static_assert(not concepts::RawImage<decltype(x)>);
#endif // PYLENE_CONCEPT_TS_ENABLED
*/
mln
::
experimental
::
fill
(
x
,
10
);
ASSERT_TRUE
(
mln
::
experimental
::
all_of
(
ima
<=
10
));
...
...
@@ -92,13 +96,15 @@ TEST(View, filter_twice)
mln
::
experimental
::
iota
(
ima
,
0
);
auto
u
=
mln
::
view
::
filter
(
ima
,
[](
int
v
)
{
return
v
>
10
&&
v
<
15
;
});
#ifdef PYLENE_CONCEPT_TS_ENABLED
static_assert
(
concepts
::
OutputImage
<
decltype
(
u
)
>
);
static_assert
(
concepts
::
ViewImage
<
decltype
(
u
)
>
);
static_assert
(
concepts
::
IndexableAndAccessibleImage
<
decltype
(
u
)
>
);
static_assert
(
not
concepts
::
BidirectionalImage
<
decltype
(
u
)
>
);
static_assert
(
not
concepts
::
RawImage
<
decltype
(
u
)
>
);
#endif // PYLENE_CONCEPT_TS_ENABLED
/*
#ifdef PYLENE_CONCEPT_TS_ENABLED
static_assert(concepts::OutputImage<decltype(u)>);
static_assert(concepts::ViewImage<decltype(u)>);
static_assert(concepts::IndexableAndAccessibleImage<decltype(u)>);
static_assert(not concepts::BidirectionalImage<decltype(u)>);
static_assert(not concepts::RawImage<decltype(u)>);
#endif // PYLENE_CONCEPT_TS_ENABLED
*/
// FIXME:
// auto x = view::filter(ima, [](int v) { return v > 10; });
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment