2 // Copyright 2005-2007 Adobe Systems Incorporated
3 // Copyright 2018 Mateusz Loskot <mateusz at loskot dot net>
5 // Distributed under the Boost Software License, Version 1.0
6 // See accompanying file LICENSE_1_0.txt or copy at
7 // http://www.boost.org/LICENSE_1_0.txt
9 #include <boost/config.hpp>
11 #if defined(BOOST_CLANG)
12 #pragma clang diagnostic push
13 #pragma GCC diagnostic ignored "-Wuninitialized"
16 #if defined(BOOST_GCC) && (BOOST_GCC >= 40900)
17 #pragma GCC diagnostic push
18 #pragma GCC diagnostic ignored "-Wuninitialized"
21 #include <boost/gil/concepts.hpp>
24 #define BOOST_TEST_MODULE test_channel_concepts
25 #include "unit_test.hpp"
26 #include "test_fixture.hpp"
28 namespace gil
= boost::gil
;
29 namespace fixture
= boost::gil::test::fixture
;
31 // A channel archetype - to test the minimum requirements of the concept
32 struct channel_value_archetype
;
34 struct channel_archetype
36 // equality comparable
37 friend bool operator==(channel_archetype
const&, channel_archetype
const&)
39 // inequality comparable
40 friend bool operator!=(channel_archetype
const&, channel_archetype
const&)
42 // less-than comparable
43 friend bool operator<(channel_archetype
const&, channel_archetype
const&)
45 // convertible to a scalar
46 operator std::uint8_t() const { return 0; }
48 channel_archetype
& operator++() { return *this; }
49 channel_archetype
& operator--() { return *this; }
50 channel_archetype
operator++(int) { return *this; }
51 channel_archetype
operator--(int) { return *this; }
53 template <typename Scalar
>
54 channel_archetype
operator+=(Scalar
) { return *this; }
55 template <typename Scalar
>
56 channel_archetype
operator-=(Scalar
) { return *this; }
57 template <typename Scalar
>
58 channel_archetype
operator*=(Scalar
) { return *this; }
59 template <typename Scalar
>
60 channel_archetype
operator/=(Scalar
) { return *this; }
62 using value_type
= channel_value_archetype
;
63 using reference
= channel_archetype
;
64 using const_reference
= channel_archetype
const;
65 using pointer
= channel_value_archetype
*;
66 using const_pointer
= channel_value_archetype
const*;
67 static constexpr bool is_mutable
= true;
69 static value_type
min_value();
70 static value_type
max_value();
73 struct channel_value_archetype
: public channel_archetype
75 // default constructible
76 channel_value_archetype() {}
78 channel_value_archetype(channel_value_archetype
const&) = default;
80 channel_value_archetype
& operator=(channel_value_archetype
const&)
82 channel_value_archetype(std::uint8_t) {}
85 channel_value_archetype
channel_archetype::min_value()
87 return channel_value_archetype();
90 channel_value_archetype
channel_archetype::max_value()
92 return channel_value_archetype();
95 BOOST_AUTO_TEST_CASE(channel_minimal_requirements
)
97 // Do only compile-time tests for the archetype
98 // (because asserts like val1<val2 fail)
99 boost::function_requires
<gil::MutableChannelConcept
<channel_archetype
>>();
101 fixture::channel_value
<channel_value_archetype
>();
102 fixture::channel_reference
<channel_archetype
>();
103 fixture::channel_reference
<channel_archetype
const&>();