kernel.hpp 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. /*
  2. Copyright 2005-2007 Adobe Systems Incorporated
  3. Use, modification and distribution are subject to the Boost Software License,
  4. Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
  5. http://www.boost.org/LICENSE_1_0.txt).
  6. */
  7. /*************************************************************************************************/
  8. #ifndef BOOST_GIL_EXTENSION_NUMERIC_KERNEL_HPP
  9. #define BOOST_GIL_EXTENSION_NUMERIC_KERNEL_HPP
  10. /*!
  11. /// \file
  12. /// \brief Definitions of 1D fixed-size and variable-size kernels and related operations
  13. /// \author Hailin Jin and Lubomir Bourdev \n
  14. /// Adobe Systems Incorporated
  15. /// \date 2005-2007 \n
  16. */
  17. #include <cstddef>
  18. #include <cassert>
  19. #include <array>
  20. #include <algorithm>
  21. #include <vector>
  22. #include <memory>
  23. #include <boost/gil/gil_config.hpp>
  24. #include <boost/gil/utilities.hpp>
  25. namespace boost { namespace gil {
  26. namespace detail {
  27. /// \brief kernel adaptor for one-dimensional cores
  28. /// Core needs to provide size(),begin(),end(),operator[],
  29. /// value_type,iterator,const_iterator,reference,const_reference
  30. template <typename Core>
  31. class kernel_1d_adaptor : public Core {
  32. private:
  33. std::size_t _center;
  34. public:
  35. kernel_1d_adaptor() : _center(0) {}
  36. explicit kernel_1d_adaptor(std::size_t center_in) : _center(center_in) {assert(_center<this->size());}
  37. kernel_1d_adaptor(std::size_t size_in,std::size_t center_in) :
  38. Core(size_in), _center(center_in) {assert(_center<this->size());}
  39. kernel_1d_adaptor(const kernel_1d_adaptor& k_in) : Core(k_in), _center(k_in._center) {}
  40. kernel_1d_adaptor& operator=(const kernel_1d_adaptor& k_in) {
  41. Core::operator=(k_in);
  42. _center=k_in._center;
  43. return *this;
  44. }
  45. std::size_t left_size() const {assert(_center<this->size());return _center;}
  46. std::size_t right_size() const {assert(_center<this->size());return this->size()-_center-1;}
  47. std::size_t& center() {return _center;}
  48. const std::size_t& center() const {return _center;}
  49. };
  50. } // namespace detail
  51. /// \brief variable-size kernel
  52. template <typename T, typename Alloc = std::allocator<T> >
  53. class kernel_1d : public detail::kernel_1d_adaptor<std::vector<T,Alloc> > {
  54. typedef detail::kernel_1d_adaptor<std::vector<T,Alloc> > parent_t;
  55. public:
  56. kernel_1d() {}
  57. kernel_1d(std::size_t size_in,std::size_t center_in) : parent_t(size_in,center_in) {}
  58. template <typename FwdIterator>
  59. kernel_1d(FwdIterator elements, std::size_t size_in, std::size_t center_in) : parent_t(size_in,center_in) {
  60. detail::copy_n(elements,size_in,this->begin());
  61. }
  62. kernel_1d(const kernel_1d& k_in) : parent_t(k_in) {}
  63. };
  64. /// \brief static-size kernel
  65. template <typename T,std::size_t Size>
  66. class kernel_1d_fixed : public detail::kernel_1d_adaptor<std::array<T,Size> > {
  67. typedef detail::kernel_1d_adaptor<std::array<T,Size> > parent_t;
  68. public:
  69. kernel_1d_fixed() {}
  70. explicit kernel_1d_fixed(std::size_t center_in) : parent_t(center_in) {}
  71. template <typename FwdIterator>
  72. explicit kernel_1d_fixed(FwdIterator elements, std::size_t center_in) : parent_t(center_in) {
  73. detail::copy_n(elements,Size,this->begin());
  74. }
  75. kernel_1d_fixed(const kernel_1d_fixed& k_in) : parent_t(k_in) {}
  76. };
  77. /// \brief reverse a kernel
  78. template <typename Kernel>
  79. inline Kernel reverse_kernel(const Kernel& kernel) {
  80. Kernel result(kernel);
  81. result.center()=kernel.right_size();
  82. std::reverse(result.begin(), result.end());
  83. return result;
  84. }
  85. } } // namespace boost::gil
  86. #endif // BOOST_GIL_EXTENSION_NUMERIC_KERNEL_HPP