00001 // Copyright (C) 2004 EPITA Research and Development Laboratory 00002 // 00003 // This file is part of the Olena Library. This library is free 00004 // software; you can redistribute it and/or modify it under the terms 00005 // of the GNU General Public License version 2 as published by the 00006 // Free Software Foundation. 00007 // 00008 // This library is distributed in the hope that it will be useful, 00009 // but WITHOUT ANY WARRANTY; without even the implied warranty of 00010 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00011 // General Public License for more details. 00012 // 00013 // You should have received a copy of the GNU General Public License 00014 // along with this library; see the file COPYING. If not, write to 00015 // the Free Software Foundation, 59 Temple Place - Suite 330, Boston, 00016 // MA 02111-1307, USA. 00017 // 00018 // As a special exception, you may use this file as part of a free 00019 // software library without restriction. Specifically, if other files 00020 // instantiate templates or use macros or inline functions from this 00021 // file, or you compile this file and link it with other files to 00022 // produce an executable, this file does not by itself cause the 00023 // resulting executable to be covered by the GNU General Public 00024 // License. This exception does not however invalidate any other 00025 // reasons why the executable file might be covered by the GNU General 00026 // Public License. 00027 00028 #ifndef NTG_CORE_PRED_SUCC_HH 00029 # define NTG_CORE_PRED_SUCC_HH 00030 00031 00032 #include <mlc/is_a.hh> 00033 #include <ntg/real/int_u.hh> 00034 #include <ntg/core/macros.hh> 00035 00036 namespace ntg { 00037 00038 namespace internal { 00040 template <typename T> 00041 struct with_arith 00042 { 00043 typedef typename ntg_is_a(T, non_vectorial)::ensure_type non_v; 00044 00045 typedef int_u<1> bool_with_arith; 00046 typedef T non_vectorial_with_arith; 00047 00048 typedef typename mlc::if_<ntg_is_a(T, ntg::binary)::ret, 00049 id_<bool_with_arith>, 00050 id_<non_vectorial_with_arith> >::ret::ret ret; 00051 }; 00052 } 00053 00058 template <typename T> 00059 T 00060 succ(const T &t) 00061 { 00062 return T(internal::with_arith<T>::ret(t) + 1); 00063 } 00064 00069 template <typename T> 00070 T 00071 pred(const T&t) 00072 { 00073 return T(internal::with_arith<T>::ret(t) - 1); 00074 } 00075 00076 namespace internal { 00082 template <typename T> 00083 struct default_less 00084 { 00085 typedef T arg_type; 00086 bool operator()(const T& l, 00087 const T& r) const 00088 { 00089 return l < r; 00090 } 00091 }; 00092 } 00093 } 00094 00095 #endif