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

snake_generic.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_CANVAS_BROWSING_SNAKE_GENERIC_HH
00027 # define MLN_CANVAS_BROWSING_SNAKE_GENERIC_HH
00028 
00032 
00033 # include <vector>
00034 # include <mln/core/concept/browsing.hh>
00035 
00036 
00037 namespace mln
00038 {
00039 
00040   namespace canvas
00041   {
00042 
00043     namespace browsing
00044     {
00045 
00047 
00075       struct snake_generic_t : public Browsing< snake_generic_t >
00076       {
00077 
00078         template <typename F>
00079         void operator()(F& f) const;
00080 
00081       };
00082 
00083       extern const snake_generic_t snake_generic;
00084 
00085 # ifndef MLN_INCLUDE_ONLY
00086 
00087       const snake_generic_t snake_generic;
00088 
00089       template <typename F>
00090       inline
00091       void
00092       snake_generic_t::operator()(F& f) const
00093       {
00094         trace::entering("canvas::browsing::snake_generic");
00095         mln_precondition(f.input.is_valid());
00096 
00097         // p init
00098         f.p = f.input.bbox().pmin();// - f.dps[0];
00099 
00100         std::vector< int > directions(f.moves.size(), 0);
00101         unsigned deph = 0;
00102         unsigned total_deph = f.moves.size() / 2 + 1;
00103 
00104         // initialization
00105         f.init();
00106 
00107         bool first = true;
00108         directions[deph] = 1;
00109         deph = total_deph - 1;
00110 
00111         // Call the move function (for the first point)
00112         (f.*(f.moves[(deph - 1) * 2 - 1 + directions[deph - 1]])) ();
00113         while (deph > 0) // If direction is empty, break
00114         {
00115           mln_assertion(deph <= total_deph);
00116           mln_assertion(deph > 0);
00117           // If f.p is near the border (we ended a direction) -> next child
00118           if (!f.input.domain().has(f.p +
00119                                     f.dps[(deph - 1) * 2 - 1 + directions[deph - 1]]))
00120           {
00121             // Go up the tree
00122             deph--;
00123             if (deph >= 1)
00124               // Change directions
00125               directions[deph] = directions[deph] == 1 ? 0 : 1;
00126             continue;
00127           }
00128 
00129           if (!first)
00130           {
00131             // Move f.p
00132             f.p += f.dps[(deph - 1) * 2 - 1 + directions[deph - 1]];
00133             // Call the move function
00134             (f.*(f.moves[(deph - 1) * 2 - 1 + directions[deph - 1]])) ();
00135           }
00136           else
00137             first = false;
00138 
00139           if (deph != total_deph)
00140           {
00141             // Go down the tree
00142             deph++;
00143             first = true;
00144           }
00145         }
00146 
00147         trace::exiting("canvas::browsing::snake_generic");
00148       }
00149 
00150 # endif // ! MLN_INCLUDE_ONLY
00151 
00152     } // end of namespace mln::canvas::browsing
00153 
00154   } // end of namespace mln::canvas
00155 
00156 } // end of namespace mln
00157 
00158 
00159 #endif // ! MLN_CANVAS_BROWSING_SNAKE_GENERIC_HH

Generated on Thu Sep 8 2011 18:32:28 for Milena (Olena) by  doxygen 1.7.1