00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef PPL_distances_inlines_hh
00025 #define PPL_distances_inlines_hh 1
00026
00027 #include "Result.defs.hh"
00028
00029 namespace Parma_Polyhedra_Library {
00030
00031
00032
00033 template <typename To, typename From>
00034 struct maybe_assign_struct {
00035 static inline Result
00036 function(const To*& top, To& tmp, const From& from, Rounding_Dir dir) {
00037
00038
00039 top = &tmp;
00040 return assign_r(tmp, from, dir);
00041 }
00042 };
00043
00044 template <typename Type>
00045 struct maybe_assign_struct<Type, Type> {
00046 static inline Result
00047 function(const Type*& top, Type&, const Type& from, Rounding_Dir) {
00048
00049 top = &from;
00050 return V_EQ;
00051 }
00052 };
00053
00054 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
00055
00061 #endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
00062 template <typename To, typename From>
00063 inline Result
00064 maybe_assign(const To*& top, To& tmp, const From& from, Rounding_Dir dir) {
00065 return maybe_assign_struct<To, From>::function(top, tmp, from, dir);
00066 }
00067
00068 template <typename Temp>
00069 inline void
00070 Rectilinear_Distance_Specialization<Temp>::combine(Temp& running,
00071 const Temp& current,
00072 Rounding_Dir dir) {
00073 add_assign_r(running, running, current, dir);
00074 }
00075
00076 template <typename Temp>
00077 inline void
00078 Rectilinear_Distance_Specialization<Temp>::finalize(Temp&, Rounding_Dir) {
00079 }
00080
00081 template <typename Temp>
00082 inline void
00083 Euclidean_Distance_Specialization<Temp>::combine(Temp& running,
00084 Temp& current,
00085 Rounding_Dir dir) {
00086 mul_assign_r(current, current, current, dir);
00087 add_assign_r(running, running, current, dir);
00088 }
00089
00090 template <typename Temp>
00091 inline void
00092 Euclidean_Distance_Specialization<Temp>::finalize(Temp& running,
00093 Rounding_Dir dir) {
00094 sqrt_assign_r(running, running, dir);
00095 }
00096
00097 template <typename Temp>
00098 inline void
00099 L_Infinity_Distance_Specialization<Temp>::combine(Temp& running,
00100 const Temp& current,
00101 Rounding_Dir) {
00102 if (current > running)
00103 running = current;
00104 }
00105
00106 template <typename Temp>
00107 inline void
00108 L_Infinity_Distance_Specialization<Temp>::finalize(Temp&, Rounding_Dir) {
00109 }
00110
00111 }
00112
00113 #endif // !defined(PPL_distances_inlines_hh)