Turi Create  4.0
kernel.hpp
Go to the documentation of this file.
1 /* Copyright © 2017 Apple Inc. All rights reserved.
2  *
3  * Use of this source code is governed by a BSD-3-clause license that can
4  * be found in the LICENSE.txt file or at https://opensource.org/licenses/BSD-3-Clause
5  */
6 /*
7  Copyright 2005-2007 Adobe Systems Incorporated
8  Distributed under the MIT License (see accompanying file LICENSE_1_0_0.txt
9  or a copy at http://opensource.adobe.com/licenses.html)
10 */
11 
12 /*************************************************************************************************/
13 
14 #ifndef GIL_KERNEL_HPP
15 #define GIL_KERNEL_HPP
16 
17 /*!
18 /// \file
19 /// \brief Definitions of 1D fixed-size and variable-size kernels and related operations
20 /// \author Hailin Jin and Lubomir Bourdev \n
21 /// Adobe Systems Incorporated
22 /// \date 2005-2007 \n Last updated on September 26, 2006
23 */
24 
25 #include <cstddef>
26 #include <cassert>
27 #include <algorithm>
28 #include <vector>
29 #include <memory>
30 #include <boost/array.hpp>
31 #include "../../gil_config.hpp"
32 #include "../../utilities.hpp"
33 
34 namespace boost { namespace gil {
35 
36 namespace detail {
37 
38 /// \brief kernel adaptor for one-dimensional cores
39 /// Core needs to provide size(),begin(),end(),operator[],
40 /// value_type,iterator,const_iterator,reference,const_reference
41 template <typename Core>
42 class kernel_1d_adaptor : public Core {
43 private:
44  std::size_t _center;
45 public:
46  kernel_1d_adaptor() : _center(0) {}
47  explicit kernel_1d_adaptor(std::size_t center_in) : _center(center_in) {assert(_center<this->size());}
48  kernel_1d_adaptor(std::size_t size_in,std::size_t center_in) :
49  Core(size_in), _center(center_in) {assert(_center<this->size());}
50  kernel_1d_adaptor(const kernel_1d_adaptor& k_in) : Core(k_in), _center(k_in._center) {}
51 
52  kernel_1d_adaptor& operator=(const kernel_1d_adaptor& k_in) {
53  Core::operator=(k_in);
54  _center=k_in._center;
55  return *this;
56  }
57  std::size_t left_size() const {assert(_center<this->size());return _center;}
58  std::size_t right_size() const {assert(_center<this->size());return this->size()-_center-1;}
59  std::size_t& center() {return _center;}
60  const std::size_t& center() const {return _center;}
61 };
62 
63 } // namespace detail
64 
65 /// \brief variable-size kernel
66 template <typename T, typename Alloc = std::allocator<T> >
67 class kernel_1d : public detail::kernel_1d_adaptor<std::vector<T,Alloc> > {
69 public:
70  kernel_1d() {}
71  kernel_1d(std::size_t size_in,std::size_t center_in) : parent_t(size_in,center_in) {}
72  template <typename FwdIterator>
73  kernel_1d(FwdIterator elements, std::size_t size_in, std::size_t center_in) : parent_t(size_in,center_in) {
74  detail::copy_n(elements,size_in,this->begin());
75  }
76  kernel_1d(const kernel_1d& k_in) : parent_t(k_in) {}
77 };
78 
79 /// \brief static-size kernel
80 template <typename T,std::size_t Size>
81 class kernel_1d_fixed : public detail::kernel_1d_adaptor<array<T,Size> > {
83 public:
84  kernel_1d_fixed() {}
85  explicit kernel_1d_fixed(std::size_t center_in) : parent_t(center_in) {}
86 
87  template <typename FwdIterator>
88  explicit kernel_1d_fixed(FwdIterator elements, std::size_t center_in) : parent_t(center_in) {
89  detail::copy_n(elements,Size,this->begin());
90  }
91  kernel_1d_fixed(const kernel_1d_fixed& k_in) : parent_t(k_in) {}
92 };
93 
94 /// \brief reverse a kernel
95 template <typename Kernel>
96 inline Kernel reverse_kernel(const Kernel& kernel) {
97  Kernel result(kernel);
98  result.center()=kernel.right_size();
99  std::reverse(result.begin(), result.end());
100  return result;
101 }
102 
103 
104 } } // namespace boost::gil
105 
106 #endif
variable-size kernel
Definition: kernel.hpp:67
Kernel reverse_kernel(const Kernel &kernel)
reverse a kernel
Definition: kernel.hpp:96
kernel adaptor for one-dimensional cores Core needs to provide size(),begin(),end(),operator[], value_type,iterator,const_iterator,reference,const_reference
Definition: kernel.hpp:42
static-size kernel
Definition: kernel.hpp:81