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