• Main Page
  • Related Pages
  • Modules
  • Namespaces
  • Classes
  • Files
  • File List

shift.hh

00001 // Copyright (C) 2007, 2008, 2009 EPITA Research and Development Laboratory (LRDE)
00002 //
00003 // This file is part of Olena.
00004 //
00005 // Olena is free software: you can redistribute it and/or modify it under
00006 // the terms of the GNU General Public License as published by the Free
00007 // Software Foundation, version 2 of the License.
00008 //
00009 // Olena is distributed in the hope that it will be useful,
00010 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00011 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00012 // General Public License for more details.
00013 //
00014 // You should have received a copy of the GNU General Public License
00015 // along with Olena.  If not, see <http://www.gnu.org/licenses/>.
00016 //
00017 // As a special exception, you may use this file as part of a free
00018 // software project without restriction.  Specifically, if other files
00019 // instantiate templates or use macros or inline functions from this
00020 // file, or you compile this file and link it with other files to produce
00021 // an executable, this file does not by itself cause the resulting
00022 // executable to be covered by the GNU General Public License.  This
00023 // exception does not however invalidate any other reasons why the
00024 // executable file might be covered by the GNU General Public License.
00025 
00026 #ifndef MLN_WIN_SHIFT_HH
00027 # define MLN_WIN_SHIFT_HH
00028 
00032 
00033 # include <mln/core/window.hh>
00034 
00035 
00036 
00037 namespace mln
00038 {
00039 
00040   namespace win
00041   {
00042 
00044     template <typename W>
00045     mln_regular(W)
00046     shift(const Window<W>& win, const mln_dpsite(W)& dp);
00047 
00048 
00049 # ifndef MLN_INCLUDE_ONLY
00050 
00051     namespace impl
00052     {
00053 
00054       template <typename W>
00055       inline
00056       mln_regular(W)
00057       shift_(trait::window::definition::unique,
00058              const W& win, const mln_dpsite(W)& dp)
00059       {
00060         mlc_is(mln_trait_window_size(W),
00061                trait::window::size::fixed)::check();
00062         mln_regular(W) tmp;
00063         unsigned n = win.size();
00064         for (unsigned i = 0; i < n; ++i)
00065           tmp.insert(win.dp(i) + dp);
00066         return tmp;
00067       }
00068 
00069       template <typename W>
00070       inline
00071       mln_regular(W)
00072       shift_(trait::window::definition::multiple,
00073              const W& win, const mln_dpsite(W)& dp)
00074       {
00075         mln_regular(W) tmp(win.function());
00076         const unsigned nw = win.nwindows();
00077         for (unsigned w = 0; w < nw; ++w)
00078           tmp.set_window(w, win::shift(win.window(w), dp));
00079         return tmp;
00080       }
00081 
00082     } // end of namespace mln::win::impl
00083 
00084 
00085     // Facade.
00086     template <typename W>
00087     inline
00088     mln_regular(W)
00089     shift(const Window<W>& win, const mln_dpsite(W)& dp)
00090     {
00091       trace::entering("win::shift");
00092 
00093       mlc_is(mln_trait_window_support(W),
00094              trait::window::support::regular)::check();
00095       mlc_is_not(mln_trait_window_definition(W),
00096                  trait::window::definition::varying)::check();
00097 
00098       mln_regular(W) tmp = impl::shift_(mln_trait_window_definition(W)(),
00099                                         exact(win), dp);
00100 
00101       trace::exiting("win::shift");
00102       return tmp;
00103     }
00104 
00105 # endif // ! MLN_INCLUDE_ONLY
00106 
00107   } // end of namespace mln::win
00108 
00109 } // end of namespace mln
00110 
00111 
00112 #endif // ! MLN_WIN_SHIFT_HH

Generated on Tue Oct 4 2011 15:24:25 for Milena (Olena) by  doxygen 1.7.1