BWAPI
|
00001 // Copyright (c) 2008 Max-Planck-Institute Saarbruecken (Germany). 00002 // All rights reserved. 00003 // 00004 // This file is part of CGAL (www.cgal.org); you can redistribute it and/or 00005 // modify it under the terms of the GNU Lesser General Public License as 00006 // published by the Free Software Foundation; version 2.1 of the License. 00007 // See the file LICENSE.LGPL distributed with CGAL. 00008 // 00009 // Licensees holding a valid commercial license may use this file in 00010 // accordance with the commercial license agreement provided with the software. 00011 // 00012 // This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE 00013 // WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 00014 // 00015 // $URL: svn+ssh://scm.gforge.inria.fr/svn/cgal/branches/CGAL-3.5-branch/Number_types/include/CGAL/Interval_traits.h $ 00016 // $Id: Interval_traits.h 47256 2008-12-06 21:43:14Z afabri $ 00017 // 00018 // 00019 // Author(s) : Michael Hemmer <hemmer@mpi-inf.mpg.de> 00020 // 00021 // ============================================================================ 00022 00023 00029 /* bounds-related Interval functions */ 00030 // template<class Interval> T lower(const Interval& x); 00031 // template<class Interval> T upper(const Interval& x); 00032 // template<class Interval> T width(const Interval& x); 00033 // template<class Interval> T median(const Interval& x); 00034 // template<class Interval> T norm(const Interval& x); 00035 00036 /* bounds-related Interval functions */ 00038 // template<class Interval> bool singleton(const Interval& x); 00039 // template<class Interval> bool zero_in(const Interval& b); 00040 // template<class Interval> bool in(const T& r, const Interval& b); 00041 // template<class Interval> bool equal(const Interval& x, const Interval& y); 00042 // template<class Interval> bool overlap(const Interval& x, const Interval& y); 00043 // template<class Interval> bool subset(const Interval& a, const Interval& b); 00044 // template<class Interval> bool proper_subset(const Interval& a, const Interval& b); 00045 00046 /* set manipulation interval functions */ 00047 // template<class Interval> Interval intersection(const Interval& x, const Interval& y); 00048 // template<class Interval> Interval hull(const Interval& x, const Interval& y); 00049 00050 00051 #ifndef CGAL_INTERVAL_TRAITS_H 00052 #define CGAL_INTERVAL_TRAITS_H 00053 00054 #include <CGAL/basic.h> 00055 00056 CGAL_BEGIN_NAMESPACE 00057 00058 namespace CGALi{ 00059 00060 template<typename T> struct Interval_traits_base{ 00061 00062 typedef Interval_traits_base<T> Self; 00063 typedef T Interval; 00064 typedef CGAL::Null_functor Boundary; 00065 typedef CGAL::Tag_false Is_interval; 00066 typedef CGAL::Tag_false With_empty_interval; 00067 00068 typedef CGAL::Null_functor Lower; 00069 typedef CGAL::Null_functor Upper; 00070 typedef CGAL::Null_functor Width; 00071 typedef CGAL::Null_functor Median; 00072 typedef CGAL::Null_functor Norm; 00073 typedef CGAL::Null_functor Empty; 00074 typedef CGAL::Null_functor Singleton; 00075 typedef CGAL::Null_functor In; 00076 typedef CGAL::Null_functor Zero_in; 00077 typedef CGAL::Null_functor Equal; 00078 typedef CGAL::Null_functor Overlap; 00079 typedef CGAL::Null_functor Subset; 00080 typedef CGAL::Null_functor Proper_Subset; 00081 typedef CGAL::Null_functor Intersection; 00082 typedef CGAL::Null_functor Hull; 00083 }; 00084 } 00085 00086 template <typename T> struct Interval_traits: public CGALi::Interval_traits_base<T>{}; 00087 class Exception_intersection_is_empty{}; 00088 00089 // function returning type Boundary 00090 template<typename Interval> inline 00091 typename Interval_traits<Interval>::Boundary 00092 lower(const Interval& interval) { 00093 typename Interval_traits<Interval>::Lower lower; 00094 return lower(interval); 00095 } 00096 00097 template<typename Interval> inline 00098 typename Interval_traits<Interval>::Boundary 00099 upper(const Interval& interval) { 00100 typename Interval_traits<Interval>::Upper upper; 00101 return upper(interval); 00102 } 00103 00104 template<typename Interval> inline 00105 typename Interval_traits<Interval>::Boundary 00106 width(Interval interval) { 00107 typename Interval_traits<Interval>::Width width; 00108 return width(interval); 00109 } 00110 00111 template<typename Interval> inline 00112 typename Interval_traits<Interval>::Boundary 00113 median(Interval interval) { 00114 typename Interval_traits<Interval>::Median median; 00115 return median(interval); 00116 } 00117 00118 template<typename Interval> inline 00119 typename Interval_traits<Interval>::Boundary 00120 norm(Interval interval) { 00121 typename Interval_traits<Interval>::Norm norm; 00122 return norm(interval); 00123 } 00124 00125 00126 // functions returning bool 00127 00128 template<typename Interval> inline 00129 typename Interval_traits<Interval>::Empty::result_type 00130 empty(Interval interval) { 00131 typename Interval_traits<Interval>::Empty empty; 00132 return empty(interval); 00133 } 00134 00135 template<typename Interval> inline 00136 typename Interval_traits<Interval>::Singleton::result_type 00137 singleton(Interval interval) { 00138 typename Interval_traits<Interval>::Singleton singleton; 00139 return singleton(interval); 00140 } 00141 00142 template<typename Interval> inline 00143 typename Interval_traits<Interval>::In::result_type 00144 in(typename Interval_traits<Interval>::Boundary x, Interval interval) { 00145 typename Interval_traits<Interval>::In in; 00146 return in(x,interval); 00147 } 00148 00149 template<typename Interval> inline 00150 typename Interval_traits<Interval>::Zero_in::result_type 00151 zero_in(Interval interval) { 00152 typename Interval_traits<Interval>::Zero_in zero_in; 00153 return zero_in(interval); 00154 } 00155 00156 // This ones should be removed, since even boost_1_35_0 has changed to zero_in 00157 template<typename Interval> inline 00158 typename Interval_traits<Interval>::Zero_in::result_type 00159 in_zero(Interval interval) { 00160 typename Interval_traits<Interval>::Zero_in zero_in; 00161 return zero_in(interval); 00162 } 00163 00164 template<typename Interval> inline 00165 typename Interval_traits<Interval>::Equal::result_type 00166 equal(Interval interval1,Interval interval2) { 00167 typename Interval_traits<Interval>::Equal equal; 00168 return equal(interval1,interval2); 00169 } 00170 00171 template<typename Interval> inline 00172 typename Interval_traits<Interval>::Overlap::result_type 00173 overlap(Interval interval1, Interval interval2) { 00174 typename Interval_traits<Interval>::Overlap overlap; 00175 return overlap(interval1, interval2); 00176 } 00177 00178 template<typename Interval> inline 00179 typename Interval_traits<Interval>::Subset::result_type 00180 subset(Interval interval1, Interval interval2) { 00181 typename Interval_traits<Interval>::Subset subset; 00182 return subset(interval1, interval2); 00183 } 00184 00185 template<typename Interval> inline 00186 typename Interval_traits<Interval>::Proper_subset::result_type 00187 proper_subset(Interval interval1, Interval interval2) { 00188 typename Interval_traits<Interval>::Proper_subset proper_subset; 00189 return proper_subset(interval1, interval2); 00190 } 00191 00192 00193 // Set operations, functions returing Interval 00194 template<typename Interval> inline 00195 typename Interval_traits<Interval>::Intersection::result_type 00196 intersection(Interval interval1, Interval interval2) { 00197 typename Interval_traits<Interval>::Intersection intersection; 00198 return intersection(interval1, interval2); 00199 } 00200 00201 template<typename Interval> inline 00202 typename Interval_traits<Interval>::Hull::result_type 00203 hull(Interval interval1, Interval interval2) { 00204 typename Interval_traits<Interval>::Hull hull; 00205 return hull(interval1, interval2); 00206 } 00207 00208 00209 00210 CGAL_END_NAMESPACE 00211 00212 #endif // CGAL_INTERVAL_TRAITS_H