xref: /trunk/main/basebmp/inc/basebmp/accessor.hxx (revision 48cdb363)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 #ifndef INCLUDED_BASEBMP_ACCESSOR_HXX
25 #define INCLUDED_BASEBMP_ACCESSOR_HXX
26 
27 #include <vigra/numerictraits.hxx>
28 
29 namespace basebmp
30 {
31 
32 /** Standard accessor type
33 
34     Accesses the iterator values the standard way (i.e. via
35     *operator()/operator[])
36  */
37 template<typename ValueType> class StandardAccessor
38 {
39 public:
40     typedef ValueType value_type;
41 
42     // -------------------------------------------------------
43 
44     template< class Iterator >
operator ()(Iterator const & i) const45     value_type operator()(Iterator const& i) const
46     {
47         return *i;
48     }
49 
50     template< class Iterator, class Difference >
operator ()(Iterator const & i,Difference const & diff) const51     value_type operator()(Iterator const& i, Difference const& diff) const
52     {
53         return i[diff];
54     }
55 
56     // -------------------------------------------------------
57 
58     template< typename V, class Iterator >
set(V const & value,Iterator const & i) const59     void set(V const& value, Iterator const& i) const
60     {
61         *i = vigra::detail::RequiresExplicitCast<value_type>::cast(value);
62     }
63 
64     template< typename V, class Iterator, class Difference >
set(V const & value,Iterator const & i,Difference const & diff) const65     void set(V const& value, Iterator const& i, Difference const& diff) const
66     {
67         i[diff] = vigra::detail::RequiresExplicitCast<value_type>::cast(value);
68     }
69 };
70 
71 //-----------------------------------------------------------------------------
72 
73 /** Non-standard accessor type
74 
75     Uses getter/setter methods at the given iterator type, to access
76     the underlying values.
77  */
78 template<typename ValueType> class NonStandardAccessor
79 {
80 public:
81     typedef ValueType value_type;
82 
83     // -------------------------------------------------------
84 
85     template< class Iterator >
operator ()(Iterator const & i) const86     value_type operator()(Iterator const& i) const
87     {
88         return i.get();
89     }
90 
91     template< class Iterator, class Difference >
operator ()(Iterator const & i,Difference const & diff) const92     value_type operator()(Iterator const& i, Difference const& diff) const
93     {
94         return i.get(diff);
95     }
96 
97     // -------------------------------------------------------
98 
99     template< typename V, class Iterator >
set(V const & value,Iterator const & i) const100     void set(V const& value, Iterator const& i) const
101     {
102         i.set( vigra::detail::RequiresExplicitCast<value_type>::cast(value) );
103     }
104 
105     template< typename V, class Iterator, class Difference >
set(V const & value,Iterator const & i,Difference const & diff) const106     void set(V const& value, Iterator const& i, Difference const& diff) const
107     {
108         i.set( vigra::detail::RequiresExplicitCast<value_type>::cast(value),
109                diff );
110     }
111 };
112 
113 } // namespace basebmp
114 
115 #endif /* INCLUDED_BASEBMP_ACCESSOR_HXX */
116