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 >= 40600)
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&>();