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

value_set.hh

00001 // Copyright (C) 2007, 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_CORE_CONCEPT_VALUE_SET_HH
00027 # define MLN_CORE_CONCEPT_VALUE_SET_HH
00028 
00033 # include <mln/core/concept/value_iterator.hh> // FIXME: Why not object.hh?
00034 
00035 
00036 namespace mln
00037 {
00038 
00039   // Fwd decl.
00040   template <typename E> struct Value_Set;
00041 
00042   // Value_Set category flag type.
00043   template <>
00044   struct Value_Set<void>
00045   {
00046     typedef Object<void> super;
00047   };
00048 
00049 
00055   template <typename E>
00056   struct Value_Set : public Object<E>
00057   {
00058     typedef Value_Set<void> category;
00059 
00060     /*
00061       typedef value;
00062       typedef fwd_viter;
00063       typedef bkd_viter;
00064 
00065       bool has(const value& v) const;
00066 
00067       value operator[](unsigned i) const;
00068       unsigned index_of(const value& v) const;
00069 
00070       unsigned nvalues() const;
00071      */
00072 
00073   protected:
00074     Value_Set();
00075   };
00076 
00077 
00078   template <typename E>
00079   std::ostream& operator<<(std::ostream& ostr, const Value_Set<E>& vs);
00080 
00081 
00082 # ifndef MLN_INCLUDE_ONLY
00083 
00084   template <typename E>
00085   inline
00086   Value_Set<E>::Value_Set()
00087   {
00088     typedef mln_value(E) value;
00089     typedef mln_fwd_viter(E) fwd_viter;
00090     typedef mln_bkd_viter(E) bkd_viter;
00091     
00092     bool (E::*m1)(const value&) const = & E::has;
00093     m1 = 0;
00094     value (E::*m2)(unsigned) const = & E::operator[];
00095     m2 = 0;
00096     unsigned (E::*m3)() const = & E::nvalues;
00097     m3 = 0;
00098   }
00099 
00100   template <typename E>
00101   inline
00102   std::ostream& operator<<(std::ostream& ostr, const Value_Set<E>& vs_)
00103   {
00104     const E& vs = exact(vs_);
00105     ostr << "{ ";
00106     for (unsigned i = 0; i < vs.nvalues(); ++i)
00107       std::cout << vs[i] << ' ';
00108     return ostr << '}';
00109   }
00110 
00111 # endif // ! MLN_INCLUDE_ONLY
00112 
00113 } // end of namespace mln
00114 
00115 
00116 #endif // ! MLN_CORE_CONCEPT_VALUE_SET_HH

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