Milena (Olena)
User documentation 2.0a Id
|
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_CORE_INTERNAL_SITE_SET_BASE_HH 00027 # define MLN_CORE_INTERNAL_SITE_SET_BASE_HH 00028 00033 00034 # include <mln/core/concept/site_set.hh> 00035 # include <mln/core/concept/site_proxy.hh> 00036 00037 00038 namespace mln 00039 { 00040 00041 namespace internal 00042 { 00043 00044 00051 template <typename P, typename E> 00052 struct site_set_base_ : public Site_Set<E> 00053 { 00055 typedef typename subject<P>::ret site; 00056 00060 bool is_empty() const; 00061 00062 protected: 00063 site_set_base_(); 00064 00065 private: 00066 // Default impl based on the number of sites. It can be 00067 // overridden in subclasses that do not feature the 'nsites' 00068 // method. 00069 bool is_empty_() const; 00070 }; 00071 00072 00073 # ifndef MLN_INCLUDE_ONLY 00074 00075 template <typename P, typename E> 00076 inline 00077 site_set_base_<P,E>::site_set_base_() 00078 { 00079 } 00080 00081 template <typename P, typename E> 00082 inline 00083 bool 00084 site_set_base_<P,E>::is_empty() const 00085 { 00086 return exact(this)->is_empty_(); 00087 } 00088 00089 template <typename P, typename E> 00090 inline 00091 bool 00092 site_set_base_<P,E>::is_empty_() const 00093 { 00094 mlc_is(mln_trait_site_set_nsites(E), 00095 trait::site_set::nsites::known)::check(); 00096 return exact(this)->nsites() == 0; 00097 } 00098 00099 # endif // ! MLN_INCLUDE_ONLY 00100 00101 } // end of namespace mln::internal 00102 00103 } // end of namespace mln 00104 00105 00106 #endif // ! MLN_CORE_INTERNAL_SITE_SET_BASE_HH